@vibe-validate/extractors 0.17.0-rc3 → 0.17.0-rc4

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 (158) hide show
  1. package/dist/extractor-registry.d.ts +72 -0
  2. package/dist/extractor-registry.d.ts.map +1 -0
  3. package/dist/extractor-registry.js +243 -0
  4. package/dist/extractor-registry.js.map +1 -0
  5. package/dist/extractors/ava/index.d.ts +23 -0
  6. package/dist/extractors/ava/index.d.ts.map +1 -0
  7. package/dist/extractors/ava/index.js +507 -0
  8. package/dist/extractors/ava/index.js.map +1 -0
  9. package/dist/extractors/ava/index.test.d.ts +7 -0
  10. package/dist/extractors/ava/index.test.d.ts.map +1 -0
  11. package/dist/extractors/ava/index.test.js +408 -0
  12. package/dist/extractors/ava/index.test.js.map +1 -0
  13. package/dist/extractors/eslint/index.d.ts +18 -0
  14. package/dist/extractors/eslint/index.d.ts.map +1 -0
  15. package/dist/extractors/eslint/index.js +206 -0
  16. package/dist/extractors/eslint/index.js.map +1 -0
  17. package/dist/extractors/eslint/index.test.d.ts +9 -0
  18. package/dist/extractors/eslint/index.test.d.ts.map +1 -0
  19. package/dist/extractors/eslint/index.test.js +191 -0
  20. package/dist/extractors/eslint/index.test.js.map +1 -0
  21. package/dist/extractors/generic/index.d.ts +30 -0
  22. package/dist/extractors/generic/index.d.ts.map +1 -0
  23. package/dist/extractors/generic/index.js +140 -0
  24. package/dist/extractors/generic/index.js.map +1 -0
  25. package/dist/extractors/generic/index.test.d.ts +7 -0
  26. package/dist/extractors/generic/index.test.d.ts.map +1 -0
  27. package/dist/extractors/generic/index.test.js +61 -0
  28. package/dist/extractors/generic/index.test.js.map +1 -0
  29. package/dist/extractors/jasmine/index.d.ts +17 -0
  30. package/dist/extractors/jasmine/index.d.ts.map +1 -0
  31. package/dist/extractors/jasmine/index.js +242 -0
  32. package/dist/extractors/jasmine/index.js.map +1 -0
  33. package/dist/extractors/jasmine/index.test.d.ts +7 -0
  34. package/dist/extractors/jasmine/index.test.d.ts.map +1 -0
  35. package/dist/extractors/jasmine/index.test.js +318 -0
  36. package/dist/extractors/jasmine/index.test.js.map +1 -0
  37. package/dist/extractors/jest/index.d.ts +17 -0
  38. package/dist/extractors/jest/index.d.ts.map +1 -0
  39. package/dist/extractors/jest/index.js +273 -0
  40. package/dist/extractors/jest/index.js.map +1 -0
  41. package/dist/extractors/jest/index.test.d.ts +9 -0
  42. package/dist/extractors/jest/index.test.d.ts.map +1 -0
  43. package/dist/extractors/jest/index.test.js +338 -0
  44. package/dist/extractors/jest/index.test.js.map +1 -0
  45. package/dist/extractors/junit/index.d.ts +18 -0
  46. package/dist/extractors/junit/index.d.ts.map +1 -0
  47. package/dist/extractors/junit/index.js +259 -0
  48. package/dist/extractors/junit/index.js.map +1 -0
  49. package/dist/extractors/junit/index.test.d.ts +7 -0
  50. package/dist/extractors/junit/index.test.d.ts.map +1 -0
  51. package/dist/extractors/junit/index.test.js +341 -0
  52. package/dist/extractors/junit/index.test.js.map +1 -0
  53. package/dist/extractors/maven-checkstyle/index.d.ts +23 -0
  54. package/dist/extractors/maven-checkstyle/index.d.ts.map +1 -0
  55. package/dist/extractors/maven-checkstyle/index.js +263 -0
  56. package/dist/extractors/maven-checkstyle/index.js.map +1 -0
  57. package/dist/extractors/maven-checkstyle/index.test.d.ts +2 -0
  58. package/dist/extractors/maven-checkstyle/index.test.d.ts.map +1 -0
  59. package/dist/extractors/maven-checkstyle/index.test.js +197 -0
  60. package/dist/extractors/maven-checkstyle/index.test.js.map +1 -0
  61. package/dist/extractors/maven-compiler/index.d.ts +23 -0
  62. package/dist/extractors/maven-compiler/index.d.ts.map +1 -0
  63. package/dist/extractors/maven-compiler/index.js +271 -0
  64. package/dist/extractors/maven-compiler/index.js.map +1 -0
  65. package/dist/extractors/maven-compiler/index.test.d.ts +2 -0
  66. package/dist/extractors/maven-compiler/index.test.d.ts.map +1 -0
  67. package/dist/extractors/maven-compiler/index.test.js +189 -0
  68. package/dist/extractors/maven-compiler/index.test.js.map +1 -0
  69. package/dist/extractors/maven-surefire/index.d.ts +23 -0
  70. package/dist/extractors/maven-surefire/index.d.ts.map +1 -0
  71. package/dist/extractors/maven-surefire/index.js +292 -0
  72. package/dist/extractors/maven-surefire/index.js.map +1 -0
  73. package/dist/extractors/maven-surefire/index.test.d.ts +2 -0
  74. package/dist/extractors/maven-surefire/index.test.d.ts.map +1 -0
  75. package/dist/extractors/maven-surefire/index.test.js +163 -0
  76. package/dist/extractors/maven-surefire/index.test.js.map +1 -0
  77. package/dist/extractors/mocha/index.d.ts +17 -0
  78. package/dist/extractors/mocha/index.d.ts.map +1 -0
  79. package/dist/extractors/mocha/index.js +241 -0
  80. package/dist/extractors/mocha/index.js.map +1 -0
  81. package/dist/extractors/mocha/index.test.d.ts +7 -0
  82. package/dist/extractors/mocha/index.test.d.ts.map +1 -0
  83. package/dist/extractors/mocha/index.test.js +300 -0
  84. package/dist/extractors/mocha/index.test.js.map +1 -0
  85. package/dist/extractors/playwright/index.d.ts +17 -0
  86. package/dist/extractors/playwright/index.d.ts.map +1 -0
  87. package/dist/extractors/playwright/index.js +320 -0
  88. package/dist/extractors/playwright/index.js.map +1 -0
  89. package/dist/extractors/playwright/index.test.d.ts +7 -0
  90. package/dist/extractors/playwright/index.test.d.ts.map +1 -0
  91. package/dist/extractors/playwright/index.test.js +274 -0
  92. package/dist/extractors/playwright/index.test.js.map +1 -0
  93. package/dist/extractors/tap/index.d.ts +23 -0
  94. package/dist/extractors/tap/index.d.ts.map +1 -0
  95. package/dist/extractors/tap/index.js +352 -0
  96. package/dist/extractors/tap/index.js.map +1 -0
  97. package/dist/extractors/tap/index.test.d.ts +7 -0
  98. package/dist/extractors/tap/index.test.d.ts.map +1 -0
  99. package/dist/extractors/tap/index.test.js +100 -0
  100. package/dist/extractors/tap/index.test.js.map +1 -0
  101. package/dist/extractors/typescript/index.d.ts +17 -0
  102. package/dist/extractors/typescript/index.d.ts.map +1 -0
  103. package/dist/extractors/typescript/index.js +150 -0
  104. package/dist/extractors/typescript/index.js.map +1 -0
  105. package/dist/extractors/typescript/index.test.d.ts +9 -0
  106. package/dist/extractors/typescript/index.test.d.ts.map +1 -0
  107. package/dist/extractors/typescript/index.test.js +177 -0
  108. package/dist/extractors/typescript/index.test.js.map +1 -0
  109. package/dist/extractors/vitest/index.d.ts +17 -0
  110. package/dist/extractors/vitest/index.d.ts.map +1 -0
  111. package/dist/extractors/vitest/index.js +564 -0
  112. package/dist/extractors/vitest/index.js.map +1 -0
  113. package/dist/extractors/vitest/index.test.d.ts +9 -0
  114. package/dist/extractors/vitest/index.test.d.ts.map +1 -0
  115. package/dist/extractors/vitest/index.test.js +373 -0
  116. package/dist/extractors/vitest/index.test.js.map +1 -0
  117. package/dist/index.d.ts +27 -13
  118. package/dist/index.d.ts.map +1 -1
  119. package/dist/index.js +27 -13
  120. package/dist/index.js.map +1 -1
  121. package/dist/maven-checkstyle-extractor.d.ts.map +1 -1
  122. package/dist/maven-checkstyle-extractor.js +2 -17
  123. package/dist/maven-checkstyle-extractor.js.map +1 -1
  124. package/dist/maven-compiler-extractor.d.ts +20 -0
  125. package/dist/maven-compiler-extractor.d.ts.map +1 -0
  126. package/dist/maven-compiler-extractor.js +218 -0
  127. package/dist/maven-compiler-extractor.js.map +1 -0
  128. package/dist/maven-utils.d.ts +24 -0
  129. package/dist/maven-utils.d.ts.map +1 -0
  130. package/dist/maven-utils.js +36 -0
  131. package/dist/maven-utils.js.map +1 -0
  132. package/dist/plugin-loader.d.ts +82 -0
  133. package/dist/plugin-loader.d.ts.map +1 -0
  134. package/dist/plugin-loader.js +200 -0
  135. package/dist/plugin-loader.js.map +1 -0
  136. package/dist/sandbox.d.ts +161 -0
  137. package/dist/sandbox.d.ts.map +1 -0
  138. package/dist/sandbox.js +254 -0
  139. package/dist/sandbox.js.map +1 -0
  140. package/dist/sandbox.test.d.ts +8 -0
  141. package/dist/sandbox.test.d.ts.map +1 -0
  142. package/dist/sandbox.test.js +395 -0
  143. package/dist/sandbox.test.js.map +1 -0
  144. package/dist/sandboxed-extractor.d.ts +51 -0
  145. package/dist/sandboxed-extractor.d.ts.map +1 -0
  146. package/dist/sandboxed-extractor.js +172 -0
  147. package/dist/sandboxed-extractor.js.map +1 -0
  148. package/dist/sandboxed-extractor.test.d.ts +5 -0
  149. package/dist/sandboxed-extractor.test.d.ts.map +1 -0
  150. package/dist/sandboxed-extractor.test.js +346 -0
  151. package/dist/sandboxed-extractor.test.js.map +1 -0
  152. package/dist/smart-extractor.d.ts +22 -10
  153. package/dist/smart-extractor.d.ts.map +1 -1
  154. package/dist/smart-extractor.js +116 -186
  155. package/dist/smart-extractor.js.map +1 -1
  156. package/dist/types.d.ts +94 -0
  157. package/dist/types.d.ts.map +1 -1
  158. package/package.json +2 -1
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Maven Compiler error extractor
3
+ *
4
+ * Extracts Java compilation errors from Maven compiler plugin output.
5
+ * Supports output from `mvn compile` and `mvn test` when compilation fails.
6
+ */
7
+ import { MAX_ERRORS_IN_ARRAY } from './result-schema.js';
8
+ import { extractRelativePath } from './maven-utils.js';
9
+ const COMPILER_PATTERNS = {
10
+ // [ERROR] /path/to/File.java:[line,column] error message
11
+ // eslint-disable-next-line sonarjs/slow-regex -- Safe: Maven compiler output is structured, limited line length
12
+ errorLine: /^\[ERROR\]\s+([^:]+):\[(\d+)(?:,(\d+))?\]\s+(.+)$/,
13
+ // Markers for high-confidence detection
14
+ compilationErrorMarker: /^\[ERROR\]\s+COMPILATION ERROR\s*:/,
15
+ compilerPluginMarker: /maven-compiler-plugin/,
16
+ errorCountMarker: /^\[INFO\]\s+(\d+)\s+errors?\s*$/,
17
+ // Common Java compiler error patterns
18
+ compilerErrorPatterns: [
19
+ 'cannot find symbol',
20
+ 'incompatible types',
21
+ 'class, interface, or enum expected',
22
+ 'illegal start of expression',
23
+ 'reached end of file while parsing',
24
+ 'package .* does not exist',
25
+ 'method .* cannot be applied',
26
+ ],
27
+ };
28
+ /**
29
+ * Detects if output is from Maven compiler plugin
30
+ */
31
+ // eslint-disable-next-line sonarjs/cognitive-complexity -- Complexity 22 acceptable for detection (sequentially checks 5 distinct Maven compiler output patterns for accurate detection)
32
+ export function detectMavenCompiler(output) {
33
+ const lines = output.split('\n');
34
+ let score = 0;
35
+ const foundPatterns = [];
36
+ // Look for compilation error markers
37
+ let hasErrorLineFormat = false;
38
+ let hasCompilerErrorPattern = false;
39
+ for (const line of lines) {
40
+ // High-value markers (30 points each)
41
+ if (COMPILER_PATTERNS.compilationErrorMarker.test(line)) {
42
+ score += 30;
43
+ foundPatterns.push('[ERROR] COMPILATION ERROR marker');
44
+ }
45
+ if (COMPILER_PATTERNS.compilerPluginMarker.test(line)) {
46
+ score += 30;
47
+ foundPatterns.push('maven-compiler-plugin reference');
48
+ }
49
+ // Medium-value markers (20 points)
50
+ if (COMPILER_PATTERNS.errorCountMarker.test(line)) {
51
+ score += 20;
52
+ foundPatterns.push('error count summary');
53
+ }
54
+ if (!hasErrorLineFormat && COMPILER_PATTERNS.errorLine.test(line)) {
55
+ score += 20;
56
+ foundPatterns.push('file:[line,column] format');
57
+ hasErrorLineFormat = true;
58
+ }
59
+ // Low-value markers (10 points for first match)
60
+ if (!hasCompilerErrorPattern) {
61
+ for (const pattern of COMPILER_PATTERNS.compilerErrorPatterns) {
62
+ if (line.includes(pattern)) {
63
+ score += 10;
64
+ foundPatterns.push('Java compiler error pattern');
65
+ hasCompilerErrorPattern = true;
66
+ break;
67
+ }
68
+ }
69
+ }
70
+ }
71
+ // Determine reason based on score
72
+ let reason;
73
+ if (score >= 70) {
74
+ reason = 'Maven compiler plugin output detected';
75
+ }
76
+ else if (score >= 40) {
77
+ reason = 'Possible Maven compiler output';
78
+ }
79
+ else {
80
+ reason = 'Not Maven compiler output';
81
+ }
82
+ return {
83
+ confidence: Math.min(score, 100),
84
+ patterns: foundPatterns,
85
+ reason,
86
+ };
87
+ }
88
+ /**
89
+ * Extracts compilation errors from Maven compiler output
90
+ */
91
+ // eslint-disable-next-line sonarjs/cognitive-complexity -- Complexity 21 acceptable for extraction (parses Maven compiler output with context lines, deduplication, and error formatting)
92
+ export function extractMavenCompiler(output, command) {
93
+ const detection = detectMavenCompiler(output);
94
+ if (detection.confidence < 40) {
95
+ return {
96
+ summary: 'Not Maven compiler output',
97
+ totalErrors: 0,
98
+ errors: [],
99
+ metadata: {
100
+ detection: {
101
+ extractor: 'maven-compiler',
102
+ confidence: detection.confidence,
103
+ patterns: detection.patterns,
104
+ reason: detection.reason,
105
+ },
106
+ confidence: detection.confidence,
107
+ completeness: 100,
108
+ issues: [],
109
+ },
110
+ };
111
+ }
112
+ const compilationErrors = [];
113
+ const lines = output.split('\n');
114
+ // Parse error lines
115
+ for (let i = 0; i < lines.length; i++) {
116
+ const line = lines[i];
117
+ const match = COMPILER_PATTERNS.errorLine.exec(line);
118
+ if (match) {
119
+ const [, filePath, lineStr, colStr, message] = match;
120
+ // Collect additional context (symbol, location) from next lines
121
+ const contextLines = [];
122
+ for (let j = i + 1; j < Math.min(i + 5, lines.length); j++) {
123
+ const nextLine = lines[j]?.trim();
124
+ if (nextLine && !nextLine.startsWith('[') && (nextLine.startsWith('symbol:') || nextLine.startsWith('location:'))) {
125
+ contextLines.push(nextLine);
126
+ }
127
+ else if (nextLine?.startsWith('[')) {
128
+ // Hit next Maven log line
129
+ break;
130
+ }
131
+ }
132
+ const fullMessage = contextLines.length > 0
133
+ ? `${message}\n${contextLines.join('\n')}`
134
+ : message;
135
+ compilationErrors.push({
136
+ file: extractRelativePath(filePath),
137
+ line: Number.parseInt(lineStr, 10),
138
+ column: colStr ? Number.parseInt(colStr, 10) : undefined,
139
+ message: fullMessage.trim(),
140
+ });
141
+ }
142
+ }
143
+ // Remove duplicates (Maven sometimes reports errors twice)
144
+ const uniqueErrors = deduplicateErrors(compilationErrors);
145
+ // Convert to FormattedError format
146
+ const errors = uniqueErrors.slice(0, MAX_ERRORS_IN_ARRAY).map((e) => ({
147
+ file: e.file,
148
+ line: e.line,
149
+ column: e.column,
150
+ message: e.message,
151
+ }));
152
+ // Group by file for summary
153
+ const fileGroups = groupByFile(uniqueErrors);
154
+ const summary = `${uniqueErrors.length} compilation error(s) in ${fileGroups.size} file(s)`;
155
+ // Generate guidance
156
+ const guidance = uniqueErrors.length > 0
157
+ ? `Fix Java compilation errors. Run ${command ?? 'mvn compile'} to see all details.`
158
+ : undefined;
159
+ // Create error summary
160
+ const errorSummary = errors.length > 0
161
+ ? errors.map((e, i) => {
162
+ const location = e.column ? `${e.file}:${e.line}:${e.column}` : `${e.file}:${e.line}`;
163
+ return `[Error ${i + 1}/${errors.length}] ${location}\n${e.message}`;
164
+ }).join('\n\n')
165
+ : undefined;
166
+ return {
167
+ summary,
168
+ totalErrors: uniqueErrors.length,
169
+ errors,
170
+ guidance,
171
+ errorSummary,
172
+ metadata: {
173
+ detection: {
174
+ extractor: 'maven-compiler',
175
+ confidence: detection.confidence,
176
+ patterns: detection.patterns,
177
+ reason: detection.reason,
178
+ },
179
+ confidence: 100,
180
+ completeness: 100,
181
+ issues: [],
182
+ },
183
+ };
184
+ }
185
+ // Relative path extraction moved to maven-utils.ts (shared with maven-checkstyle-extractor)
186
+ /**
187
+ * Deduplicate compilation errors
188
+ */
189
+ function deduplicateErrors(errors) {
190
+ const seen = new Set();
191
+ const unique = [];
192
+ for (const e of errors) {
193
+ const key = `${e.file}:${e.line}:${e.column}:${e.message.split('\n')[0]}`;
194
+ if (!seen.has(key)) {
195
+ seen.add(key);
196
+ unique.push(e);
197
+ }
198
+ }
199
+ return unique;
200
+ }
201
+ /**
202
+ * Group errors by file
203
+ */
204
+ function groupByFile(errors) {
205
+ const groups = new Map();
206
+ for (const error of errors) {
207
+ const file = error.file || 'unknown';
208
+ if (!groups.has(file)) {
209
+ groups.set(file, []);
210
+ }
211
+ const group = groups.get(file);
212
+ if (group) {
213
+ group.push(error);
214
+ }
215
+ }
216
+ return groups;
217
+ }
218
+ //# sourceMappingURL=maven-compiler-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maven-compiler-extractor.js","sourceRoot":"","sources":["../src/maven-compiler-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Maven Utilities
3
+ *
4
+ * Shared utility functions for Maven extractors (Checkstyle, Surefire, Compiler)
5
+ *
6
+ * @package @vibe-validate/extractors
7
+ */
8
+ /**
9
+ * Extract relative path from absolute path
10
+ *
11
+ * Attempts to extract the meaningful source path from absolute file paths
12
+ * by finding common Java/Kotlin source roots.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * extractRelativePath('/Users/name/project/src/main/java/com/example/Foo.java')
17
+ * // => 'src/main/java/com/example/Foo.java'
18
+ * ```
19
+ *
20
+ * @param absolutePath - Absolute file path
21
+ * @returns Relative path from source root, or fallback to last few segments
22
+ */
23
+ export declare function extractRelativePath(absolutePath: string): string;
24
+ //# sourceMappingURL=maven-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maven-utils.d.ts","sourceRoot":"","sources":["../src/maven-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAchE"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Maven Utilities
3
+ *
4
+ * Shared utility functions for Maven extractors (Checkstyle, Surefire, Compiler)
5
+ *
6
+ * @package @vibe-validate/extractors
7
+ */
8
+ /**
9
+ * Extract relative path from absolute path
10
+ *
11
+ * Attempts to extract the meaningful source path from absolute file paths
12
+ * by finding common Java/Kotlin source roots.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * extractRelativePath('/Users/name/project/src/main/java/com/example/Foo.java')
17
+ * // => 'src/main/java/com/example/Foo.java'
18
+ * ```
19
+ *
20
+ * @param absolutePath - Absolute file path
21
+ * @returns Relative path from source root, or fallback to last few segments
22
+ */
23
+ export function extractRelativePath(absolutePath) {
24
+ // Common Java/Kotlin source roots in Maven projects
25
+ const sourceRoots = ['src/main/java', 'src/test/java', 'src/main/kotlin', 'src/test/kotlin'];
26
+ for (const root of sourceRoots) {
27
+ const index = absolutePath.indexOf(root);
28
+ if (index !== -1) {
29
+ return absolutePath.slice(index);
30
+ }
31
+ }
32
+ // Fallback: return last few path segments (enough to identify the file)
33
+ const segments = absolutePath.split('/');
34
+ return segments.slice(-3).join('/');
35
+ }
36
+ //# sourceMappingURL=maven-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maven-utils.js","sourceRoot":"","sources":["../src/maven-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,mBAAmB,CAAC,YAAoB;IACtD,oDAAoD;IACpD,MAAM,WAAW,GAAG,CAAC,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;IAE7F,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Plugin Loader
3
+ *
4
+ * Discovers and loads external extractor plugins from filesystem and npm packages.
5
+ * Provides security validation and interface compliance checking.
6
+ *
7
+ * @package @vibe-validate/extractors
8
+ */
9
+ import type { ExtractorPlugin } from './types.js';
10
+ /**
11
+ * Plugin source configuration
12
+ */
13
+ export type PluginSource = {
14
+ type: 'path';
15
+ path: string;
16
+ } | {
17
+ type: 'package';
18
+ package: string;
19
+ };
20
+ /**
21
+ * Plugin discovery configuration
22
+ */
23
+ export interface PluginDiscoveryConfig {
24
+ /** Explicit plugin sources from config */
25
+ extractors?: PluginSource[];
26
+ /** Base directory for auto-discovery (default: process.cwd()) */
27
+ baseDir?: string;
28
+ }
29
+ /**
30
+ * Plugin validation error
31
+ */
32
+ export declare class PluginValidationError extends Error {
33
+ readonly _pluginSource: string;
34
+ constructor(message: string, _pluginSource: string);
35
+ }
36
+ /**
37
+ * Load a single plugin from a source
38
+ *
39
+ * @param source - Plugin source (file path or npm package)
40
+ * @returns Validated extractor plugin
41
+ * @throws PluginValidationError if plugin is invalid
42
+ */
43
+ export declare function loadPlugin(source: PluginSource): Promise<ExtractorPlugin>;
44
+ /**
45
+ * Discover and load all plugins
46
+ *
47
+ * - Loads explicitly configured plugins from config
48
+ * - Auto-discovers plugins from vibe-validate-local-plugins/ directory
49
+ * - Skips invalid plugins with warnings (fail-safe)
50
+ *
51
+ * @param config - Plugin discovery configuration
52
+ * @returns Array of validated plugins
53
+ */
54
+ export declare function discoverPlugins(config?: PluginDiscoveryConfig): Promise<ExtractorPlugin[]>;
55
+ /**
56
+ * Validate that an object conforms to ExtractorPlugin interface
57
+ *
58
+ * @param plugin - Object to validate
59
+ * @param source - Plugin source (for error messages)
60
+ * @throws PluginValidationError if validation fails
61
+ */
62
+ export declare function validatePluginInterface(plugin: unknown, source: string): asserts plugin is ExtractorPlugin;
63
+ /**
64
+ * Register plugins dynamically with the extractor registry
65
+ *
66
+ * This function will be used to add external plugins to EXTRACTOR_REGISTRY
67
+ * at runtime after discovery.
68
+ *
69
+ * @param plugins - Array of validated plugins to register
70
+ * @returns Array of extractor descriptors added to registry
71
+ */
72
+ export declare function registerPlugins(plugins: ExtractorPlugin[]): Array<{
73
+ name: string;
74
+ priority: number;
75
+ detect: (_output: string) => {
76
+ confidence: number;
77
+ patterns: string[];
78
+ reason: string;
79
+ };
80
+ extract: (_output: string) => unknown;
81
+ }>;
82
+ //# sourceMappingURL=plugin-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../src/plugin-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,0CAA0C;IAC1C,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAC5B,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;aAG5B,aAAa,EAAE,MAAM;gBADrC,OAAO,EAAE,MAAM,EACC,aAAa,EAAE,MAAM;CAKxC;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CA4B/E;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CAAC,MAAM,GAAE,qBAA0B,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAcpG;AA4ED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,eAAe,CA2C1G;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACxF,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;CACvC,CAAC,CAOD"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Plugin Loader
3
+ *
4
+ * Discovers and loads external extractor plugins from filesystem and npm packages.
5
+ * Provides security validation and interface compliance checking.
6
+ *
7
+ * @package @vibe-validate/extractors
8
+ */
9
+ import { pathToFileURL } from 'node:url';
10
+ import { access, readdir } from 'node:fs/promises';
11
+ import { join, resolve } from 'node:path';
12
+ /**
13
+ * Plugin validation error
14
+ */
15
+ export class PluginValidationError extends Error {
16
+ _pluginSource;
17
+ constructor(message, _pluginSource) {
18
+ super(message);
19
+ this._pluginSource = _pluginSource;
20
+ this.name = 'PluginValidationError';
21
+ }
22
+ }
23
+ /**
24
+ * Load a single plugin from a source
25
+ *
26
+ * @param source - Plugin source (file path or npm package)
27
+ * @returns Validated extractor plugin
28
+ * @throws PluginValidationError if plugin is invalid
29
+ */
30
+ export async function loadPlugin(source) {
31
+ let plugin;
32
+ let pluginPath;
33
+ try {
34
+ if (source.type === 'path') {
35
+ // Load from file path
36
+ pluginPath = resolve(source.path);
37
+ const fileUrl = pathToFileURL(pluginPath).href;
38
+ const module = await import(fileUrl);
39
+ plugin = module.default ?? module;
40
+ }
41
+ else {
42
+ // Load from npm package
43
+ pluginPath = source.package;
44
+ const module = await import(source.package);
45
+ plugin = module.default ?? module;
46
+ }
47
+ }
48
+ catch (error) {
49
+ throw new PluginValidationError(`Failed to load plugin: ${error instanceof Error ? error.message : String(error)}`, source.type === 'path' ? source.path : source.package);
50
+ }
51
+ // Validate plugin interface
52
+ validatePluginInterface(plugin, pluginPath);
53
+ return plugin;
54
+ }
55
+ /**
56
+ * Discover and load all plugins
57
+ *
58
+ * - Loads explicitly configured plugins from config
59
+ * - Auto-discovers plugins from vibe-validate-local-plugins/ directory
60
+ * - Skips invalid plugins with warnings (fail-safe)
61
+ *
62
+ * @param config - Plugin discovery configuration
63
+ * @returns Array of validated plugins
64
+ */
65
+ export async function discoverPlugins(config = {}) {
66
+ const plugins = [];
67
+ const errors = [];
68
+ // 1. Load explicitly configured plugins
69
+ await loadConfiguredPlugins(config, plugins, errors);
70
+ // 2. Auto-discover from local plugins directory
71
+ await autoDiscoverLocalPlugins(config, plugins, errors);
72
+ // Log warnings for failed plugins (fail-safe behavior)
73
+ logPluginErrors(errors);
74
+ return plugins;
75
+ }
76
+ /**
77
+ * Load plugins explicitly configured in config
78
+ */
79
+ async function loadConfiguredPlugins(config, plugins, errors) {
80
+ if (!config.extractors || config.extractors.length === 0) {
81
+ return;
82
+ }
83
+ for (const source of config.extractors) {
84
+ try {
85
+ const plugin = await loadPlugin(source);
86
+ plugins.push(plugin);
87
+ }
88
+ catch (error) {
89
+ const sourceStr = source.type === 'path' ? source.path : source.package;
90
+ errors.push({
91
+ source: sourceStr,
92
+ error: error instanceof Error ? error.message : String(error),
93
+ });
94
+ }
95
+ }
96
+ }
97
+ /**
98
+ * Auto-discover plugins from local plugins directory
99
+ */
100
+ async function autoDiscoverLocalPlugins(config, plugins, errors) {
101
+ const baseDir = config.baseDir ?? process.cwd();
102
+ const localPluginsDir = join(baseDir, 'vibe-validate-local-plugins');
103
+ try {
104
+ await access(localPluginsDir);
105
+ const entries = await readdir(localPluginsDir, { withFileTypes: true });
106
+ for (const entry of entries) {
107
+ if (entry.isFile() && (entry.name.endsWith('.js') || entry.name.endsWith('.mjs'))) {
108
+ const pluginPath = join(localPluginsDir, entry.name);
109
+ try {
110
+ const plugin = await loadPlugin({ type: 'path', path: pluginPath });
111
+ plugins.push(plugin);
112
+ }
113
+ catch (error) {
114
+ errors.push({
115
+ source: pluginPath,
116
+ error: error instanceof Error ? error.message : String(error),
117
+ });
118
+ }
119
+ }
120
+ }
121
+ }
122
+ catch {
123
+ // Directory doesn't exist - that's fine, just skip auto-discovery
124
+ }
125
+ }
126
+ /**
127
+ * Log plugin loading errors
128
+ */
129
+ function logPluginErrors(errors) {
130
+ if (errors.length === 0) {
131
+ return;
132
+ }
133
+ console.warn('⚠️ Some plugins failed to load:');
134
+ for (const { source, error } of errors) {
135
+ console.warn(` - ${source}: ${error}`);
136
+ }
137
+ }
138
+ /**
139
+ * Validate that an object conforms to ExtractorPlugin interface
140
+ *
141
+ * @param plugin - Object to validate
142
+ * @param source - Plugin source (for error messages)
143
+ * @throws PluginValidationError if validation fails
144
+ */
145
+ export function validatePluginInterface(plugin, source) {
146
+ if (!plugin || typeof plugin !== 'object') {
147
+ throw new PluginValidationError('Plugin must be an object', source);
148
+ }
149
+ const p = plugin;
150
+ // Validate metadata
151
+ if (!p.metadata || typeof p.metadata !== 'object') {
152
+ throw new PluginValidationError('Plugin missing required metadata field', source);
153
+ }
154
+ const metadata = p.metadata;
155
+ if (!metadata.name || typeof metadata.name !== 'string') {
156
+ throw new PluginValidationError('Plugin metadata missing name', source);
157
+ }
158
+ if (!metadata.version || typeof metadata.version !== 'string') {
159
+ throw new PluginValidationError('Plugin metadata missing version', source);
160
+ }
161
+ if (!metadata.description || typeof metadata.description !== 'string') {
162
+ throw new PluginValidationError('Plugin metadata missing description', source);
163
+ }
164
+ // Validate required functions
165
+ if (typeof p.detect !== 'function') {
166
+ throw new PluginValidationError('Plugin missing required detect function', source);
167
+ }
168
+ if (typeof p.extract !== 'function') {
169
+ throw new PluginValidationError('Plugin missing required extract function', source);
170
+ }
171
+ // Validate priority
172
+ if (typeof p.priority !== 'number') {
173
+ throw new PluginValidationError('Plugin missing required priority field', source);
174
+ }
175
+ if (p.priority < 0 || p.priority > 100) {
176
+ throw new PluginValidationError('Priority must be between 0 and 100', source);
177
+ }
178
+ // Validate samples array
179
+ if (!Array.isArray(p.samples)) {
180
+ throw new PluginValidationError('Plugin missing required samples array', source);
181
+ }
182
+ }
183
+ /**
184
+ * Register plugins dynamically with the extractor registry
185
+ *
186
+ * This function will be used to add external plugins to EXTRACTOR_REGISTRY
187
+ * at runtime after discovery.
188
+ *
189
+ * @param plugins - Array of validated plugins to register
190
+ * @returns Array of extractor descriptors added to registry
191
+ */
192
+ export function registerPlugins(plugins) {
193
+ return plugins.map(plugin => ({
194
+ name: plugin.metadata.name,
195
+ priority: plugin.priority,
196
+ detect: plugin.detect,
197
+ extract: plugin.extract,
198
+ }));
199
+ }
200
+ //# sourceMappingURL=plugin-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../src/plugin-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoB1C;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAG5B;IAFlB,YACE,OAAe,EACC,aAAqB;QAErC,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,kBAAa,GAAb,aAAa,CAAQ;QAGrC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAoB;IACnD,IAAI,MAAe,CAAC;IACpB,IAAI,UAAkB,CAAC;IAEvB,IAAI,CAAC;QACH,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,sBAAsB;YACtB,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,wBAAwB;YACxB,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC;YAC5B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC;QACpC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,qBAAqB,CAC7B,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAClF,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CACtD,CAAC;IACJ,CAAC;IAED,4BAA4B;IAC5B,uBAAuB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAE5C,OAAO,MAAyB,CAAC;AACnC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAgC,EAAE;IACtE,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,MAAM,MAAM,GAA6C,EAAE,CAAC;IAE5D,wCAAwC;IACxC,MAAM,qBAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAErD,gDAAgD;IAChD,MAAM,wBAAwB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAExD,uDAAuD;IACvD,eAAe,CAAC,MAAM,CAAC,CAAC;IAExB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,qBAAqB,CAClC,MAA6B,EAC7B,OAA0B,EAC1B,MAAgD;IAEhD,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzD,OAAO;IACT,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YACxE,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,wBAAwB,CACrC,MAA6B,EAC7B,OAA0B,EAC1B,MAAgD;IAEhD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAChD,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,6BAA6B,CAAC,CAAC;IAErE,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,eAAe,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAExE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBAClF,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrD,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;oBACpE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC;wBACV,MAAM,EAAE,UAAU;wBAClB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBAC9D,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kEAAkE;IACpE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,MAAgD;IACvE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACjD,KAAK,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,MAAM,EAAE,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,QAAQ,MAAM,KAAK,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAe,EAAE,MAAc;IACrE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,qBAAqB,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,CAAC,GAAG,MAAiC,CAAC;IAE5C,oBAAoB;IACpB,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClD,MAAM,IAAI,qBAAqB,CAAC,wCAAwC,EAAE,MAAM,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAmC,CAAC;IACvD,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACxD,MAAM,IAAI,qBAAqB,CAAC,8BAA8B,EAAE,MAAM,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC9D,MAAM,IAAI,qBAAqB,CAAC,iCAAiC,EAAE,MAAM,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QACtE,MAAM,IAAI,qBAAqB,CAAC,qCAAqC,EAAE,MAAM,CAAC,CAAC;IACjF,CAAC;IAED,8BAA8B;IAC9B,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACnC,MAAM,IAAI,qBAAqB,CAAC,yCAAyC,EAAE,MAAM,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACpC,MAAM,IAAI,qBAAqB,CAAC,0CAA0C,EAAE,MAAM,CAAC,CAAC;IACtF,CAAC;IAED,oBAAoB;IACpB,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,IAAI,qBAAqB,CAAC,wCAAwC,EAAE,MAAM,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC;QACvC,MAAM,IAAI,qBAAqB,CAAC,oCAAoC,EAAE,MAAM,CAAC,CAAC;IAChF,CAAC;IAED,yBAAyB;IACzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,qBAAqB,CAAC,uCAAuC,EAAE,MAAM,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,OAA0B;IAMxD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;QAC1B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,CAAC,CAAC;AACN,CAAC"}