@skillsmith/core 0.2.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +233 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/__tests__/incremental.test.d.ts +13 -0
- package/dist/src/analysis/__tests__/incremental.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/incremental.test.js +515 -0
- package/dist/src/analysis/__tests__/incremental.test.js.map +1 -0
- package/dist/src/analysis/__tests__/integration.test.d.ts +14 -0
- package/dist/src/analysis/__tests__/integration.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/integration.test.js +1059 -0
- package/dist/src/analysis/__tests__/integration.test.js.map +1 -0
- package/dist/src/analysis/__tests__/metrics.test.d.ts +9 -0
- package/dist/src/analysis/__tests__/metrics.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/metrics.test.js +369 -0
- package/dist/src/analysis/__tests__/metrics.test.js.map +1 -0
- package/dist/src/analysis/__tests__/performance.test.d.ts +15 -0
- package/dist/src/analysis/__tests__/performance.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/performance.test.js +402 -0
- package/dist/src/analysis/__tests__/performance.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/go.test.d.ts +12 -0
- package/dist/src/analysis/adapters/__tests__/go.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/go.test.js +561 -0
- package/dist/src/analysis/adapters/__tests__/go.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/python.test.d.ts +11 -0
- package/dist/src/analysis/adapters/__tests__/python.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/python.test.js +669 -0
- package/dist/src/analysis/adapters/__tests__/python.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.d.ts +12 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.js +676 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts +14 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.js +381 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.js.map +1 -0
- package/dist/src/analysis/adapters/base.d.ts +83 -0
- package/dist/src/analysis/adapters/base.d.ts.map +1 -0
- package/dist/src/analysis/adapters/base.js +40 -0
- package/dist/src/analysis/adapters/base.js.map +1 -0
- package/dist/src/analysis/adapters/factory.d.ts +150 -0
- package/dist/src/analysis/adapters/factory.d.ts.map +1 -0
- package/dist/src/analysis/adapters/factory.js +244 -0
- package/dist/src/analysis/adapters/factory.js.map +1 -0
- package/dist/src/analysis/adapters/go.d.ts +131 -0
- package/dist/src/analysis/adapters/go.d.ts.map +1 -0
- package/dist/src/analysis/adapters/go.js +414 -0
- package/dist/src/analysis/adapters/go.js.map +1 -0
- package/dist/src/analysis/adapters/index.d.ts +20 -0
- package/dist/src/analysis/adapters/index.d.ts.map +1 -0
- package/dist/src/analysis/adapters/index.js +23 -0
- package/dist/src/analysis/adapters/index.js.map +1 -0
- package/dist/src/analysis/adapters/java.d.ts +154 -0
- package/dist/src/analysis/adapters/java.d.ts.map +1 -0
- package/dist/src/analysis/adapters/java.js +407 -0
- package/dist/src/analysis/adapters/java.js.map +1 -0
- package/dist/src/analysis/adapters/python.d.ts +165 -0
- package/dist/src/analysis/adapters/python.d.ts.map +1 -0
- package/dist/src/analysis/adapters/python.js +475 -0
- package/dist/src/analysis/adapters/python.js.map +1 -0
- package/dist/src/analysis/adapters/rust.d.ts +116 -0
- package/dist/src/analysis/adapters/rust.d.ts.map +1 -0
- package/dist/src/analysis/adapters/rust.js +476 -0
- package/dist/src/analysis/adapters/rust.js.map +1 -0
- package/dist/src/analysis/adapters/typescript.d.ts +68 -0
- package/dist/src/analysis/adapters/typescript.d.ts.map +1 -0
- package/dist/src/analysis/adapters/typescript.js +79 -0
- package/dist/src/analysis/adapters/typescript.js.map +1 -0
- package/dist/src/analysis/aggregator.d.ts +193 -0
- package/dist/src/analysis/aggregator.d.ts.map +1 -0
- package/dist/src/analysis/aggregator.js +283 -0
- package/dist/src/analysis/aggregator.js.map +1 -0
- package/dist/src/analysis/cache.d.ts +180 -0
- package/dist/src/analysis/cache.d.ts.map +1 -0
- package/dist/src/analysis/cache.js +279 -0
- package/dist/src/analysis/cache.js.map +1 -0
- package/dist/src/analysis/file-streamer.d.ts +136 -0
- package/dist/src/analysis/file-streamer.d.ts.map +1 -0
- package/dist/src/analysis/file-streamer.js +291 -0
- package/dist/src/analysis/file-streamer.js.map +1 -0
- package/dist/src/analysis/incremental-parser.d.ts +186 -0
- package/dist/src/analysis/incremental-parser.d.ts.map +1 -0
- package/dist/src/analysis/incremental-parser.js +291 -0
- package/dist/src/analysis/incremental-parser.js.map +1 -0
- package/dist/src/analysis/incremental.d.ts +186 -0
- package/dist/src/analysis/incremental.d.ts.map +1 -0
- package/dist/src/analysis/incremental.js +247 -0
- package/dist/src/analysis/incremental.js.map +1 -0
- package/dist/src/analysis/index.d.ts +25 -3
- package/dist/src/analysis/index.d.ts.map +1 -1
- package/dist/src/analysis/index.js +45 -3
- package/dist/src/analysis/index.js.map +1 -1
- package/dist/src/analysis/language-detector.d.ts +92 -0
- package/dist/src/analysis/language-detector.d.ts.map +1 -0
- package/dist/src/analysis/language-detector.js +602 -0
- package/dist/src/analysis/language-detector.js.map +1 -0
- package/dist/src/analysis/memory-monitor.d.ts +199 -0
- package/dist/src/analysis/memory-monitor.d.ts.map +1 -0
- package/dist/src/analysis/memory-monitor.js +271 -0
- package/dist/src/analysis/memory-monitor.js.map +1 -0
- package/dist/src/analysis/metrics.d.ts +300 -0
- package/dist/src/analysis/metrics.d.ts.map +1 -0
- package/dist/src/analysis/metrics.js +537 -0
- package/dist/src/analysis/metrics.js.map +1 -0
- package/dist/src/analysis/router.d.ts +264 -0
- package/dist/src/analysis/router.d.ts.map +1 -0
- package/dist/src/analysis/router.js +398 -0
- package/dist/src/analysis/router.js.map +1 -0
- package/dist/src/analysis/tree-cache.d.ts +208 -0
- package/dist/src/analysis/tree-cache.d.ts.map +1 -0
- package/dist/src/analysis/tree-cache.js +288 -0
- package/dist/src/analysis/tree-cache.js.map +1 -0
- package/dist/src/analysis/tree-sitter/manager.d.ts +141 -0
- package/dist/src/analysis/tree-sitter/manager.d.ts.map +1 -0
- package/dist/src/analysis/tree-sitter/manager.js +239 -0
- package/dist/src/analysis/tree-sitter/manager.js.map +1 -0
- package/dist/src/analysis/types.d.ts +69 -6
- package/dist/src/analysis/types.d.ts.map +1 -1
- package/dist/src/analysis/types.js +23 -2
- package/dist/src/analysis/types.js.map +1 -1
- package/dist/src/analysis/worker-pool.d.ts +141 -0
- package/dist/src/analysis/worker-pool.d.ts.map +1 -0
- package/dist/src/analysis/worker-pool.js +418 -0
- package/dist/src/analysis/worker-pool.js.map +1 -0
- package/dist/src/analytics/schema.d.ts +1 -1
- package/dist/src/analytics/schema.d.ts.map +1 -1
- package/dist/src/analytics/schema.js +72 -0
- package/dist/src/analytics/schema.js.map +1 -1
- package/dist/src/api/cache.d.ts +24 -1
- package/dist/src/api/cache.d.ts.map +1 -1
- package/dist/src/api/cache.js +50 -2
- package/dist/src/api/cache.js.map +1 -1
- package/dist/src/api/client.d.ts +132 -2
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +214 -18
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/index.d.ts +2 -0
- package/dist/src/api/index.d.ts.map +1 -1
- package/dist/src/api/index.js +7 -0
- package/dist/src/api/index.js.map +1 -1
- package/dist/src/api/types.d.ts +251 -0
- package/dist/src/api/types.d.ts.map +1 -0
- package/dist/src/api/types.js +9 -0
- package/dist/src/api/types.js.map +1 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -1
- package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -1
- package/dist/src/embeddings/index.d.ts.map +1 -1
- package/dist/src/embeddings/index.js.map +1 -1
- package/dist/src/errors.d.ts +1 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +1 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
- package/dist/src/repositories/IndexerRepository.js +1 -0
- package/dist/src/repositories/IndexerRepository.js.map +1 -1
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.js +1 -0
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -1
- package/dist/src/repositories/quarantine/query-builder.js +1 -1
- package/dist/src/repositories/quarantine/query-builder.js.map +1 -1
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +3 -3
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/scripts/github-import/index.js.map +1 -1
- package/dist/src/scripts/import-github-skills.js +1 -1
- package/dist/src/scripts/import-github-skills.js.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.js.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.js.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -1
- package/dist/src/scripts/validation/index.js +1 -2
- package/dist/src/scripts/validation/index.js.map +1 -1
- package/dist/src/scripts/validation/pipeline.d.ts.map +1 -1
- package/dist/src/scripts/validation/pipeline.js.map +1 -1
- package/dist/src/scripts/validation/types.d.ts +2 -2
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/services/SearchService.d.ts.map +1 -1
- package/dist/src/services/SearchService.js +1 -0
- package/dist/src/services/SearchService.js.map +1 -1
- package/dist/src/session/SessionHealthMonitor.d.ts +1 -1
- package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
- package/dist/src/session/SessionHealthMonitor.js +1 -1
- package/dist/src/session/SessionHealthMonitor.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -1
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +2 -2
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +27 -5
- package/dist/src/telemetry/posthog.d.ts.map +1 -1
- package/dist/src/telemetry/posthog.js +20 -5
- package/dist/src/telemetry/posthog.js.map +1 -1
- package/dist/src/types/skill.d.ts +3 -0
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types.d.ts +2 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +2 -2
- package/dist/src/types.js.map +1 -1
- package/dist/tests/adapters-factory.test.d.ts +13 -0
- package/dist/tests/adapters-factory.test.d.ts.map +1 -0
- package/dist/tests/adapters-factory.test.js +308 -0
- package/dist/tests/adapters-factory.test.js.map +1 -0
- package/dist/tests/adapters-java.test.d.ts +13 -0
- package/dist/tests/adapters-java.test.d.ts.map +1 -0
- package/dist/tests/adapters-java.test.js +925 -0
- package/dist/tests/adapters-java.test.js.map +1 -0
- package/dist/tests/api/client.validation.test.d.ts +7 -0
- package/dist/tests/api/client.validation.test.d.ts.map +1 -0
- package/dist/tests/api/client.validation.test.js +183 -0
- package/dist/tests/api/client.validation.test.js.map +1 -0
- package/dist/tests/language-detector.test.d.ts +13 -0
- package/dist/tests/language-detector.test.d.ts.map +1 -0
- package/dist/tests/language-detector.test.js +674 -0
- package/dist/tests/language-detector.test.js.map +1 -0
- package/dist/tests/telemetry/posthog.test.d.ts +13 -0
- package/dist/tests/telemetry/posthog.test.d.ts.map +1 -0
- package/dist/tests/telemetry/posthog.test.js +600 -0
- package/dist/tests/telemetry/posthog.test.js.map +1 -0
- package/package.json +5 -6
- package/dist/src/security/RateLimiter.d.ts +0 -337
- package/dist/src/security/RateLimiter.d.ts.map +0 -1
- package/dist/src/security/RateLimiter.js +0 -782
- package/dist/src/security/RateLimiter.js.map +0 -1
- package/dist/src/security/scanner.d.ts +0 -151
- package/dist/src/security/scanner.d.ts.map +0 -1
- package/dist/src/security/scanner.js +0 -599
- package/dist/src/security/scanner.js.map +0 -1
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1307: Java Language Adapter
|
|
3
|
+
*
|
|
4
|
+
* Parses Java source files and extracts imports, exports, and functions
|
|
5
|
+
* using regex-based parsing. Handles Java-specific features including:
|
|
6
|
+
* - Visibility modifiers (public, private, protected, package-private)
|
|
7
|
+
* - Annotations (@Override, @Test, @Autowired, etc.)
|
|
8
|
+
* - Generics in class and method declarations
|
|
9
|
+
* - Interfaces, abstract classes, enums, and annotation types
|
|
10
|
+
*
|
|
11
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
12
|
+
*/
|
|
13
|
+
import { LanguageAdapter } from './base.js';
|
|
14
|
+
/**
|
|
15
|
+
* Java Language Adapter
|
|
16
|
+
*
|
|
17
|
+
* Parses Java source files using regex-based parsing.
|
|
18
|
+
* Handles Java's explicit visibility modifiers and annotation system.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const adapter = new JavaAdapter()
|
|
23
|
+
* const result = adapter.parseFile(javaCode, 'Main.java')
|
|
24
|
+
* console.log(result.exports) // public classes, interfaces, enums
|
|
25
|
+
* console.log(result.functions) // public/protected methods
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export class JavaAdapter extends LanguageAdapter {
|
|
29
|
+
language = 'java';
|
|
30
|
+
extensions = ['.java'];
|
|
31
|
+
/**
|
|
32
|
+
* Parse a Java source file and extract information
|
|
33
|
+
*/
|
|
34
|
+
parseFile(content, filePath) {
|
|
35
|
+
const imports = this.extractImports(content, filePath);
|
|
36
|
+
const exports = this.extractExports(content, filePath);
|
|
37
|
+
const functions = this.extractFunctions(content, filePath);
|
|
38
|
+
return { imports, exports, functions };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Parse file incrementally (currently same as full parse)
|
|
42
|
+
*/
|
|
43
|
+
parseIncremental(content, filePath, _previousTree) {
|
|
44
|
+
// Incremental parsing not yet implemented for Java
|
|
45
|
+
// Will be added with tree-sitter integration
|
|
46
|
+
return this.parseFile(content, filePath);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get Java framework detection rules
|
|
50
|
+
*/
|
|
51
|
+
getFrameworkRules() {
|
|
52
|
+
return [
|
|
53
|
+
{
|
|
54
|
+
name: 'Spring Boot',
|
|
55
|
+
depIndicators: ['spring-boot', 'org.springframework.boot'],
|
|
56
|
+
importIndicators: ['org.springframework.boot', 'org.springframework.web'],
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: 'Spring',
|
|
60
|
+
depIndicators: ['spring-core', 'org.springframework'],
|
|
61
|
+
importIndicators: ['org.springframework'],
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: 'Quarkus',
|
|
65
|
+
depIndicators: ['io.quarkus'],
|
|
66
|
+
importIndicators: ['io.quarkus', 'javax.enterprise'],
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: 'Micronaut',
|
|
70
|
+
depIndicators: ['io.micronaut'],
|
|
71
|
+
importIndicators: ['io.micronaut'],
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: 'Jakarta EE',
|
|
75
|
+
depIndicators: ['jakarta.'],
|
|
76
|
+
importIndicators: ['jakarta.'],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: 'JUnit',
|
|
80
|
+
depIndicators: ['junit', 'org.junit'],
|
|
81
|
+
importIndicators: ['org.junit', 'junit.framework'],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: 'Hibernate',
|
|
85
|
+
depIndicators: ['hibernate', 'org.hibernate'],
|
|
86
|
+
importIndicators: ['org.hibernate', 'javax.persistence', 'jakarta.persistence'],
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: 'Lombok',
|
|
90
|
+
depIndicators: ['lombok', 'org.projectlombok'],
|
|
91
|
+
importIndicators: ['lombok'],
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: 'Maven',
|
|
95
|
+
depIndicators: ['maven', 'org.apache.maven'],
|
|
96
|
+
importIndicators: [],
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'Gradle',
|
|
100
|
+
depIndicators: ['gradle', 'org.gradle'],
|
|
101
|
+
importIndicators: [],
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: 'TestNG',
|
|
105
|
+
depIndicators: ['testng', 'org.testng'],
|
|
106
|
+
importIndicators: ['org.testng'],
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: 'Mockito',
|
|
110
|
+
depIndicators: ['mockito', 'org.mockito'],
|
|
111
|
+
importIndicators: ['org.mockito'],
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: 'Jackson',
|
|
115
|
+
depIndicators: ['jackson', 'com.fasterxml.jackson'],
|
|
116
|
+
importIndicators: ['com.fasterxml.jackson'],
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: 'Gson',
|
|
120
|
+
depIndicators: ['gson', 'com.google.gson'],
|
|
121
|
+
importIndicators: ['com.google.gson'],
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: 'Apache Commons',
|
|
125
|
+
depIndicators: ['commons-', 'org.apache.commons'],
|
|
126
|
+
importIndicators: ['org.apache.commons'],
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
name: 'SLF4J',
|
|
130
|
+
depIndicators: ['slf4j', 'org.slf4j'],
|
|
131
|
+
importIndicators: ['org.slf4j'],
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: 'Log4j',
|
|
135
|
+
depIndicators: ['log4j', 'org.apache.logging.log4j'],
|
|
136
|
+
importIndicators: ['org.apache.logging.log4j', 'org.apache.log4j'],
|
|
137
|
+
},
|
|
138
|
+
];
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Clean up resources (no-op for regex-based parsing)
|
|
142
|
+
*/
|
|
143
|
+
dispose() {
|
|
144
|
+
// No resources to clean up for regex-based parsing
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Extract import statements from Java source
|
|
148
|
+
*
|
|
149
|
+
* Handles:
|
|
150
|
+
* - Regular imports: import com.example.Class;
|
|
151
|
+
* - Static imports: import static com.example.Class.method;
|
|
152
|
+
* - Wildcard imports: import com.example.*;
|
|
153
|
+
*/
|
|
154
|
+
extractImports(content, filePath) {
|
|
155
|
+
const imports = [];
|
|
156
|
+
const lines = content.split('\n');
|
|
157
|
+
for (let i = 0; i < lines.length; i++) {
|
|
158
|
+
const line = lines[i].trim();
|
|
159
|
+
// Match: import com.example.Class;
|
|
160
|
+
// Match: import static com.example.Class.method;
|
|
161
|
+
// Match: import com.example.*;
|
|
162
|
+
const importMatch = line.match(/^import\s+(static\s+)?([\w.]+(?:\.\*)?);/);
|
|
163
|
+
if (importMatch) {
|
|
164
|
+
const isStatic = !!importMatch[1];
|
|
165
|
+
const fullPath = importMatch[2];
|
|
166
|
+
const isWildcard = fullPath.endsWith('.*');
|
|
167
|
+
const module = isWildcard ? fullPath.slice(0, -2) : fullPath;
|
|
168
|
+
// Extract the simple name from the full path
|
|
169
|
+
const parts = fullPath.split('.');
|
|
170
|
+
const simpleName = isWildcard ? undefined : parts[parts.length - 1];
|
|
171
|
+
imports.push({
|
|
172
|
+
module,
|
|
173
|
+
namedImports: simpleName && !isWildcard ? [simpleName] : [],
|
|
174
|
+
namespaceImport: isWildcard ? '*' : undefined,
|
|
175
|
+
isTypeOnly: !isStatic, // Java imports are type-only unless static
|
|
176
|
+
sourceFile: filePath,
|
|
177
|
+
line: i + 1,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return imports;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Extract exports (public declarations) from Java source
|
|
185
|
+
*
|
|
186
|
+
* In Java, exports are determined by visibility modifiers:
|
|
187
|
+
* - public: accessible from anywhere
|
|
188
|
+
* - protected: accessible from subclasses
|
|
189
|
+
* - package-private (default): accessible within package
|
|
190
|
+
* - private: not exported
|
|
191
|
+
*/
|
|
192
|
+
extractExports(content, filePath) {
|
|
193
|
+
const exports = [];
|
|
194
|
+
const lines = content.split('\n');
|
|
195
|
+
for (let i = 0; i < lines.length; i++) {
|
|
196
|
+
const line = lines[i];
|
|
197
|
+
// Match class/interface/enum/@interface declarations
|
|
198
|
+
// Supports: public, protected, private, abstract, final, static modifiers
|
|
199
|
+
const classMatch = line.match(/^\s*(public|protected|private)?\s*(abstract\s+)?(final\s+)?(static\s+)?(class|interface|enum|@interface)\s+(\w+)(?:<[^>]+>)?/);
|
|
200
|
+
if (classMatch) {
|
|
201
|
+
const visibility = classMatch[1] || 'package';
|
|
202
|
+
const _isAbstract = !!classMatch[2];
|
|
203
|
+
const type = classMatch[5];
|
|
204
|
+
const name = classMatch[6];
|
|
205
|
+
let kind = 'class';
|
|
206
|
+
if (type === 'interface' || type === '@interface')
|
|
207
|
+
kind = 'interface';
|
|
208
|
+
if (type === 'enum')
|
|
209
|
+
kind = 'enum';
|
|
210
|
+
exports.push({
|
|
211
|
+
name,
|
|
212
|
+
kind,
|
|
213
|
+
isDefault: false,
|
|
214
|
+
sourceFile: filePath,
|
|
215
|
+
visibility: visibility === 'package'
|
|
216
|
+
? 'internal'
|
|
217
|
+
: visibility,
|
|
218
|
+
line: i + 1,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return exports;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Extract function definitions from Java source
|
|
226
|
+
*
|
|
227
|
+
* Handles:
|
|
228
|
+
* - Regular methods: public void foo(String s, int n)
|
|
229
|
+
* - Generic methods: public <T> List<T> bar(T item)
|
|
230
|
+
* - Abstract methods: protected abstract void baz();
|
|
231
|
+
* - Static methods: public static void main(String[] args)
|
|
232
|
+
* - Annotated methods: @Override public String toString()
|
|
233
|
+
*/
|
|
234
|
+
extractFunctions(content, filePath) {
|
|
235
|
+
const functions = [];
|
|
236
|
+
const lines = content.split('\n');
|
|
237
|
+
for (let i = 0; i < lines.length; i++) {
|
|
238
|
+
const line = lines[i];
|
|
239
|
+
// Match method declarations:
|
|
240
|
+
// public void foo(String s, int n)
|
|
241
|
+
// private static <T> List<T> bar(T item)
|
|
242
|
+
// protected abstract void baz();
|
|
243
|
+
// @Override public String toString()
|
|
244
|
+
const methodMatch = line.match(/^\s*(public|protected|private)?\s*(static\s+)?(abstract\s+)?(final\s+)?(synchronized\s+)?(native\s+)?(<[^>]+>\s+)?(\w+(?:<[^>]+>)?(?:\[\])*)\s+(\w+)\s*\(([^)]*)\)/);
|
|
245
|
+
if (methodMatch) {
|
|
246
|
+
const visibility = methodMatch[1] || 'package';
|
|
247
|
+
const _isStatic = !!methodMatch[2];
|
|
248
|
+
const _isAbstract = !!methodMatch[3];
|
|
249
|
+
const _returnType = methodMatch[8];
|
|
250
|
+
const name = methodMatch[9];
|
|
251
|
+
const paramsStr = methodMatch[10];
|
|
252
|
+
// Skip constructors (return type matches class name pattern - would need context)
|
|
253
|
+
// Skip if the "return type" looks like a class name being constructed
|
|
254
|
+
// A simple heuristic: constructors have no return type in the regex
|
|
255
|
+
// In practice, our regex captures return type, so constructors won't match
|
|
256
|
+
// Count parameters - handle generics in parameters like List<String>
|
|
257
|
+
let paramCount = 0;
|
|
258
|
+
if (paramsStr.trim()) {
|
|
259
|
+
// Remove generic brackets to avoid splitting on commas inside them
|
|
260
|
+
let depth = 0;
|
|
261
|
+
let cleanedParams = '';
|
|
262
|
+
for (const char of paramsStr) {
|
|
263
|
+
if (char === '<')
|
|
264
|
+
depth++;
|
|
265
|
+
else if (char === '>')
|
|
266
|
+
depth--;
|
|
267
|
+
else if (char === ',' && depth === 0)
|
|
268
|
+
cleanedParams += ',';
|
|
269
|
+
else if (depth === 0)
|
|
270
|
+
cleanedParams += char;
|
|
271
|
+
}
|
|
272
|
+
paramCount = cleanedParams.split(',').filter((p) => p.trim()).length;
|
|
273
|
+
}
|
|
274
|
+
// Look for annotations above the method
|
|
275
|
+
const decorators = [];
|
|
276
|
+
for (let j = i - 1; j >= 0; j--) {
|
|
277
|
+
const prevLine = lines[j].trim();
|
|
278
|
+
if (prevLine.startsWith('@')) {
|
|
279
|
+
const annoMatch = prevLine.match(/@(\w+)/);
|
|
280
|
+
if (annoMatch) {
|
|
281
|
+
decorators.unshift(annoMatch[1]);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
else if (prevLine && !prevLine.startsWith('//') && !prevLine.startsWith('*')) {
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
functions.push({
|
|
289
|
+
name,
|
|
290
|
+
parameterCount: paramCount,
|
|
291
|
+
isAsync: false, // Java doesn't have async keyword
|
|
292
|
+
isExported: visibility === 'public' || visibility === 'protected',
|
|
293
|
+
sourceFile: filePath,
|
|
294
|
+
line: i + 1,
|
|
295
|
+
decorators: decorators.length > 0 ? decorators : undefined,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return functions;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Parse pom.xml to extract Maven dependencies
|
|
304
|
+
*
|
|
305
|
+
* @param content - Content of pom.xml file
|
|
306
|
+
* @returns Array of dependency information
|
|
307
|
+
*
|
|
308
|
+
* @example
|
|
309
|
+
* ```typescript
|
|
310
|
+
* const deps = parsePomXml(pomXmlContent)
|
|
311
|
+
* console.log(deps) // [{ name: "org.springframework:spring-core", version: "5.3.0", ... }]
|
|
312
|
+
* ```
|
|
313
|
+
*/
|
|
314
|
+
export function parsePomXml(content) {
|
|
315
|
+
const deps = [];
|
|
316
|
+
// Remove XML comments to avoid false matches
|
|
317
|
+
const contentWithoutComments = content.replace(/<!--[\s\S]*?-->/g, '');
|
|
318
|
+
// Match dependency blocks first, then extract individual elements
|
|
319
|
+
const depBlockRegex = /<dependency>([\s\S]*?)<\/dependency>/g;
|
|
320
|
+
let blockMatch;
|
|
321
|
+
while ((blockMatch = depBlockRegex.exec(contentWithoutComments)) !== null) {
|
|
322
|
+
const block = blockMatch[1];
|
|
323
|
+
// Extract individual elements from the dependency block
|
|
324
|
+
const groupIdMatch = block.match(/<groupId>([^<]+)<\/groupId>/);
|
|
325
|
+
const artifactIdMatch = block.match(/<artifactId>([^<]+)<\/artifactId>/);
|
|
326
|
+
const versionMatch = block.match(/<version>([^<]+)<\/version>/);
|
|
327
|
+
const scopeMatch = block.match(/<scope>([^<]+)<\/scope>/);
|
|
328
|
+
if (groupIdMatch && artifactIdMatch) {
|
|
329
|
+
const groupId = groupIdMatch[1].trim();
|
|
330
|
+
const artifactId = artifactIdMatch[1].trim();
|
|
331
|
+
const version = versionMatch ? versionMatch[1].trim() : 'unspecified';
|
|
332
|
+
const scope = scopeMatch ? scopeMatch[1].trim() : 'compile';
|
|
333
|
+
deps.push({
|
|
334
|
+
name: `${groupId}:${artifactId}`,
|
|
335
|
+
version,
|
|
336
|
+
isDev: scope === 'test' || scope === 'provided',
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return deps;
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Parse build.gradle or build.gradle.kts to extract Gradle dependencies
|
|
344
|
+
*
|
|
345
|
+
* @param content - Content of build.gradle file
|
|
346
|
+
* @returns Array of dependency information
|
|
347
|
+
*
|
|
348
|
+
* @example
|
|
349
|
+
* ```typescript
|
|
350
|
+
* const deps = parseBuildGradle(gradleContent)
|
|
351
|
+
* console.log(deps) // [{ name: "org.springframework:spring-core", version: "5.3.0", ... }]
|
|
352
|
+
* ```
|
|
353
|
+
*/
|
|
354
|
+
export function parseBuildGradle(content) {
|
|
355
|
+
const deps = [];
|
|
356
|
+
let match;
|
|
357
|
+
// Configuration names to match
|
|
358
|
+
const configs = 'implementation|api|testImplementation|testCompileOnly|compileOnly|runtimeOnly|testRuntimeOnly|annotationProcessor|kapt';
|
|
359
|
+
// Pattern 1: Groovy style with quotes: implementation 'group:artifact:version'
|
|
360
|
+
const groovyQuoteRegex = new RegExp(`(${configs})\\s+['"]([^'"]+)['"]`, 'g');
|
|
361
|
+
while ((match = groovyQuoteRegex.exec(content)) !== null) {
|
|
362
|
+
const config = match[1];
|
|
363
|
+
const depStr = match[2].trim();
|
|
364
|
+
addDependency(deps, config, depStr);
|
|
365
|
+
}
|
|
366
|
+
// Pattern 2: Kotlin DSL style with parens and quotes: implementation("group:artifact:version")
|
|
367
|
+
const kotlinStringRegex = new RegExp(`(${configs})\\s*\\(\\s*["']([^"']+)["']\\s*\\)`, 'g');
|
|
368
|
+
while ((match = kotlinStringRegex.exec(content)) !== null) {
|
|
369
|
+
const config = match[1];
|
|
370
|
+
const depStr = match[2].trim();
|
|
371
|
+
addDependency(deps, config, depStr);
|
|
372
|
+
}
|
|
373
|
+
// Pattern 3: Kotlin DSL with named parameters
|
|
374
|
+
// implementation(group = "com.example", name = "library", version = "1.0")
|
|
375
|
+
const kotlinNamedRegex = new RegExp(`(${configs})\\s*\\(\\s*group\\s*=\\s*"([^"]+)"\\s*,\\s*name\\s*=\\s*"([^"]+)"(?:\\s*,\\s*version\\s*=\\s*"([^"]+)")?\\s*\\)`, 'g');
|
|
376
|
+
while ((match = kotlinNamedRegex.exec(content)) !== null) {
|
|
377
|
+
const config = match[1];
|
|
378
|
+
const group = match[2];
|
|
379
|
+
const name = match[3];
|
|
380
|
+
const version = match[4] || 'unspecified';
|
|
381
|
+
deps.push({
|
|
382
|
+
name: `${group}:${name}`,
|
|
383
|
+
version,
|
|
384
|
+
isDev: config.startsWith('test'),
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
return deps;
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Helper function to add a dependency from a colon-separated string
|
|
391
|
+
*/
|
|
392
|
+
function addDependency(deps, config, depStr) {
|
|
393
|
+
// Skip project references
|
|
394
|
+
if (depStr.startsWith(':') || depStr.includes('project(')) {
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
// Parse group:artifact:version format
|
|
398
|
+
const parts = depStr.split(':');
|
|
399
|
+
if (parts.length >= 2) {
|
|
400
|
+
deps.push({
|
|
401
|
+
name: `${parts[0]}:${parts[1]}`,
|
|
402
|
+
version: parts[2] || 'unspecified',
|
|
403
|
+
isDev: config.startsWith('test') || config === 'annotationProcessor' || config === 'kapt',
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
//# sourceMappingURL=java.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"java.js","sourceRoot":"","sources":["../../../../src/analysis/adapters/java.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1304: Python Language Adapter
|
|
3
|
+
*
|
|
4
|
+
* Parses Python source files (.py, .pyi, .pyw) and extracts
|
|
5
|
+
* imports, exports, and function definitions using regex-based
|
|
6
|
+
* parsing with optional tree-sitter support for incremental parsing.
|
|
7
|
+
*
|
|
8
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
9
|
+
*/
|
|
10
|
+
import { LanguageAdapter, type SupportedLanguage, type FrameworkRule } from './base.js';
|
|
11
|
+
import type { ParseResult } from '../types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Python adapter using regex-based parsing with optional tree-sitter
|
|
14
|
+
*
|
|
15
|
+
* The adapter provides:
|
|
16
|
+
* - Synchronous regex-based parsing for basic analysis
|
|
17
|
+
* - Async tree-sitter parsing for enhanced accuracy (when available)
|
|
18
|
+
* - Framework detection rules for Django, FastAPI, Flask, etc.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const adapter = new PythonAdapter()
|
|
23
|
+
*
|
|
24
|
+
* const result = adapter.parseFile(`
|
|
25
|
+
* import os
|
|
26
|
+
* from django.http import HttpResponse
|
|
27
|
+
*
|
|
28
|
+
* def hello(request):
|
|
29
|
+
* return HttpResponse("Hello")
|
|
30
|
+
* `, 'views.py')
|
|
31
|
+
*
|
|
32
|
+
* console.log(result.imports) // [{ module: 'os', ... }, { module: 'django.http', ... }]
|
|
33
|
+
* console.log(result.functions) // [{ name: 'hello', ... }]
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare class PythonAdapter extends LanguageAdapter {
|
|
37
|
+
readonly language: SupportedLanguage;
|
|
38
|
+
readonly extensions: string[];
|
|
39
|
+
private parser;
|
|
40
|
+
private parserInitialized;
|
|
41
|
+
private parserInitPromise;
|
|
42
|
+
/**
|
|
43
|
+
* Initialize the tree-sitter parser (lazy loaded)
|
|
44
|
+
*
|
|
45
|
+
* This method is called automatically when using parseFileAsync.
|
|
46
|
+
* Tree-sitter provides more accurate parsing but requires WASM modules.
|
|
47
|
+
*/
|
|
48
|
+
initParser(): Promise<void>;
|
|
49
|
+
private doInitParser;
|
|
50
|
+
/**
|
|
51
|
+
* Parse a Python file using regex-based parsing
|
|
52
|
+
*
|
|
53
|
+
* @param content - Python source code
|
|
54
|
+
* @param filePath - Path to the file (for source tracking)
|
|
55
|
+
* @returns Parsed imports, exports, and functions
|
|
56
|
+
*/
|
|
57
|
+
parseFile(content: string, filePath: string): ParseResult;
|
|
58
|
+
/**
|
|
59
|
+
* Parse a Python file asynchronously with tree-sitter (if available)
|
|
60
|
+
*
|
|
61
|
+
* Falls back to regex parsing if tree-sitter is not available.
|
|
62
|
+
*
|
|
63
|
+
* @param content - Python source code
|
|
64
|
+
* @param filePath - Path to the file (for source tracking)
|
|
65
|
+
* @returns Promise resolving to parsed imports, exports, and functions
|
|
66
|
+
*/
|
|
67
|
+
parseFileAsync(content: string, filePath: string): Promise<ParseResult>;
|
|
68
|
+
/**
|
|
69
|
+
* Parse file incrementally using previous parse tree
|
|
70
|
+
*
|
|
71
|
+
* Currently falls back to full regex parsing. Tree-sitter
|
|
72
|
+
* incremental parsing will be implemented in SMI-1309.
|
|
73
|
+
*
|
|
74
|
+
* @param content - Updated Python source code
|
|
75
|
+
* @param filePath - Path to the file
|
|
76
|
+
* @param _previousTree - Previous parse tree (not yet used)
|
|
77
|
+
* @returns Parsed imports, exports, and functions
|
|
78
|
+
*/
|
|
79
|
+
parseIncremental(content: string, filePath: string, _previousTree?: unknown): ParseResult;
|
|
80
|
+
/**
|
|
81
|
+
* Get Python framework detection rules
|
|
82
|
+
*
|
|
83
|
+
* Detects common Python frameworks and libraries including:
|
|
84
|
+
* - Web frameworks: Django, FastAPI, Flask
|
|
85
|
+
* - Testing: pytest
|
|
86
|
+
* - Data science: pandas, numpy
|
|
87
|
+
* - Databases: SQLAlchemy
|
|
88
|
+
* - Task queues: Celery
|
|
89
|
+
*
|
|
90
|
+
* @returns Array of framework detection rules
|
|
91
|
+
*/
|
|
92
|
+
getFrameworkRules(): FrameworkRule[];
|
|
93
|
+
/**
|
|
94
|
+
* Clean up resources
|
|
95
|
+
*/
|
|
96
|
+
dispose(): void;
|
|
97
|
+
/**
|
|
98
|
+
* Parse Python source code using regex patterns
|
|
99
|
+
*
|
|
100
|
+
* @param content - Python source code
|
|
101
|
+
* @param filePath - Path to the file
|
|
102
|
+
* @returns Parsed result
|
|
103
|
+
*/
|
|
104
|
+
private parseWithRegex;
|
|
105
|
+
/**
|
|
106
|
+
* Extract imports from Python source code
|
|
107
|
+
*
|
|
108
|
+
* Handles:
|
|
109
|
+
* - `import module`
|
|
110
|
+
* - `import module as alias`
|
|
111
|
+
* - `from module import name`
|
|
112
|
+
* - `from module import name as alias`
|
|
113
|
+
* - `from module import *`
|
|
114
|
+
* - `from module import (name1, name2)`
|
|
115
|
+
*
|
|
116
|
+
* @param content - Python source code
|
|
117
|
+
* @param filePath - Path to the file
|
|
118
|
+
* @returns Array of import information
|
|
119
|
+
*/
|
|
120
|
+
private extractImports;
|
|
121
|
+
/**
|
|
122
|
+
* Parse comma-separated import names, handling aliases
|
|
123
|
+
*
|
|
124
|
+
* @param namesStr - String containing import names
|
|
125
|
+
* @returns Array of imported names (without aliases)
|
|
126
|
+
*/
|
|
127
|
+
private parseImportNames;
|
|
128
|
+
/**
|
|
129
|
+
* Extract exports from Python source code
|
|
130
|
+
*
|
|
131
|
+
* In Python, exports are determined by:
|
|
132
|
+
* 1. `__all__` list (explicit exports)
|
|
133
|
+
* 2. Top-level class/function definitions (implicit, if not starting with _)
|
|
134
|
+
*
|
|
135
|
+
* @param content - Python source code
|
|
136
|
+
* @param filePath - Path to the file
|
|
137
|
+
* @returns Array of export information
|
|
138
|
+
*/
|
|
139
|
+
private extractExports;
|
|
140
|
+
/**
|
|
141
|
+
* Extract function definitions from Python source code
|
|
142
|
+
*
|
|
143
|
+
* Handles:
|
|
144
|
+
* - Regular functions: `def func():`
|
|
145
|
+
* - Async functions: `async def func():`
|
|
146
|
+
* - Methods (indented functions)
|
|
147
|
+
*
|
|
148
|
+
* @param content - Python source code
|
|
149
|
+
* @param filePath - Path to the file
|
|
150
|
+
* @returns Array of function information
|
|
151
|
+
*/
|
|
152
|
+
private extractFunctions;
|
|
153
|
+
/**
|
|
154
|
+
* Parse Python source code using tree-sitter for more accurate results
|
|
155
|
+
*
|
|
156
|
+
* Tree-sitter provides a full AST which enables more accurate parsing
|
|
157
|
+
* of complex Python constructs.
|
|
158
|
+
*
|
|
159
|
+
* @param content - Python source code
|
|
160
|
+
* @param filePath - Path to the file
|
|
161
|
+
* @returns Parsed result
|
|
162
|
+
*/
|
|
163
|
+
private parseWithTreeSitter;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=python.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../../../src/analysis/adapters/python.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAA;AACvF,OAAO,KAAK,EAAE,WAAW,EAAwC,MAAM,aAAa,CAAA;AAEpF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,aAAc,SAAQ,eAAe;IAChD,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAW;IAC/C,QAAQ,CAAC,UAAU,WAA0B;IAE7C,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,iBAAiB,CAA6B;IAEtD;;;;;OAKG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAQnB,YAAY;IAkC1B;;;;;;OAMG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW;IAIzD;;;;;;;;OAQG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAc7E;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,WAAW;IAKzF;;;;;;;;;;;OAWG;IACH,iBAAiB,IAAI,aAAa,EAAE;IAsEpC;;OAEG;IACH,OAAO,IAAI,IAAI;IAaf;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAOtB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,cAAc;IAkFtB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,cAAc;IAkEtB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,gBAAgB;IAuCxB;;;;;;;;;OASG;IACH,OAAO,CAAC,mBAAmB;CAM5B"}
|