@skillsmith/core 0.5.3 → 0.5.4

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 (177) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/activation/ActivationManager.d.ts +7 -0
  4. package/dist/src/activation/ActivationManager.d.ts.map +1 -1
  5. package/dist/src/activation/ActivationManager.js +13 -4
  6. package/dist/src/activation/ActivationManager.js.map +1 -1
  7. package/dist/src/analysis/adapters/python.d.ts +16 -11
  8. package/dist/src/analysis/adapters/python.d.ts.map +1 -1
  9. package/dist/src/analysis/adapters/python.js +46 -61
  10. package/dist/src/analysis/adapters/python.js.map +1 -1
  11. package/dist/src/analysis/router.test.d.ts +2 -0
  12. package/dist/src/analysis/router.test.d.ts.map +1 -0
  13. package/dist/src/analysis/router.test.js +411 -0
  14. package/dist/src/analysis/router.test.js.map +1 -0
  15. package/dist/src/analysis/tree-sitter/manager.d.ts.map +1 -1
  16. package/dist/src/analysis/tree-sitter/manager.js +12 -5
  17. package/dist/src/analysis/tree-sitter/manager.js.map +1 -1
  18. package/dist/src/analysis/tree-sitter/pythonExtractor.d.ts +45 -0
  19. package/dist/src/analysis/tree-sitter/pythonExtractor.d.ts.map +1 -0
  20. package/dist/src/analysis/tree-sitter/pythonExtractor.js +264 -0
  21. package/dist/src/analysis/tree-sitter/pythonExtractor.js.map +1 -0
  22. package/dist/src/analysis/tree-sitter/pythonExtractor.test.d.ts +12 -0
  23. package/dist/src/analysis/tree-sitter/pythonExtractor.test.d.ts.map +1 -0
  24. package/dist/src/analysis/tree-sitter/pythonExtractor.test.js +74 -0
  25. package/dist/src/analysis/tree-sitter/pythonExtractor.test.js.map +1 -0
  26. package/dist/src/analysis/tree-sitter/pythonIncremental.d.ts +93 -0
  27. package/dist/src/analysis/tree-sitter/pythonIncremental.d.ts.map +1 -0
  28. package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.d.ts +22 -0
  29. package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.d.ts.map +1 -0
  30. package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.js +229 -0
  31. package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.js.map +1 -0
  32. package/dist/src/analysis/tree-sitter/pythonIncremental.js +287 -0
  33. package/dist/src/analysis/tree-sitter/pythonIncremental.js.map +1 -0
  34. package/dist/src/analysis/tree-sitter/pythonIncremental.test.d.ts +17 -0
  35. package/dist/src/analysis/tree-sitter/pythonIncremental.test.d.ts.map +1 -0
  36. package/dist/src/analysis/tree-sitter/pythonIncremental.test.js +142 -0
  37. package/dist/src/analysis/tree-sitter/pythonIncremental.test.js.map +1 -0
  38. package/dist/src/analysis/tree-sitter/queries/python.d.ts +43 -0
  39. package/dist/src/analysis/tree-sitter/queries/python.d.ts.map +1 -0
  40. package/dist/src/analysis/tree-sitter/queries/python.js +88 -0
  41. package/dist/src/analysis/tree-sitter/queries/python.js.map +1 -0
  42. package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.d.ts +13 -0
  43. package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.d.ts.map +1 -0
  44. package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.js +174 -0
  45. package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.js.map +1 -0
  46. package/dist/src/analytics/ROIDashboardService.csv.d.ts +11 -0
  47. package/dist/src/analytics/ROIDashboardService.csv.d.ts.map +1 -0
  48. package/dist/src/analytics/ROIDashboardService.csv.js +43 -0
  49. package/dist/src/analytics/ROIDashboardService.csv.js.map +1 -0
  50. package/dist/src/analytics/ROIDashboardService.d.ts +64 -3
  51. package/dist/src/analytics/ROIDashboardService.d.ts.map +1 -1
  52. package/dist/src/analytics/ROIDashboardService.js +116 -45
  53. package/dist/src/analytics/ROIDashboardService.js.map +1 -1
  54. package/dist/src/api/schemas.d.ts +70 -319
  55. package/dist/src/api/schemas.d.ts.map +1 -1
  56. package/dist/src/benchmarks/incrementalParseBenchmark.d.ts +18 -0
  57. package/dist/src/benchmarks/incrementalParseBenchmark.d.ts.map +1 -0
  58. package/dist/src/benchmarks/incrementalParseBenchmark.js +121 -0
  59. package/dist/src/benchmarks/incrementalParseBenchmark.js.map +1 -0
  60. package/dist/src/billing/GDPRComplianceService.test.d.ts +2 -0
  61. package/dist/src/billing/GDPRComplianceService.test.d.ts.map +1 -0
  62. package/dist/src/billing/GDPRComplianceService.test.js +405 -0
  63. package/dist/src/billing/GDPRComplianceService.test.js.map +1 -0
  64. package/dist/src/index.d.ts +4 -3
  65. package/dist/src/index.d.ts.map +1 -1
  66. package/dist/src/index.js +2 -2
  67. package/dist/src/index.js.map +1 -1
  68. package/dist/src/indexer/SkillParser.coverage.test.d.ts +10 -0
  69. package/dist/src/indexer/SkillParser.coverage.test.d.ts.map +1 -0
  70. package/dist/src/indexer/SkillParser.coverage.test.js +76 -0
  71. package/dist/src/indexer/SkillParser.coverage.test.js.map +1 -0
  72. package/dist/src/indexer/SkillParser.test.d.ts +2 -0
  73. package/dist/src/indexer/SkillParser.test.d.ts.map +1 -0
  74. package/dist/src/indexer/SkillParser.test.js +375 -0
  75. package/dist/src/indexer/SkillParser.test.js.map +1 -0
  76. package/dist/src/scripts/validation/types.d.ts +14 -24
  77. package/dist/src/scripts/validation/types.d.ts.map +1 -1
  78. package/dist/src/services/skill-config-schema.d.ts +4 -36
  79. package/dist/src/services/skill-config-schema.d.ts.map +1 -1
  80. package/dist/src/sources/LocalFilesystemAdapter.d.ts +104 -10
  81. package/dist/src/sources/LocalFilesystemAdapter.d.ts.map +1 -1
  82. package/dist/src/sources/LocalFilesystemAdapter.helpers.d.ts +92 -0
  83. package/dist/src/sources/LocalFilesystemAdapter.helpers.d.ts.map +1 -0
  84. package/dist/src/sources/LocalFilesystemAdapter.helpers.js +157 -0
  85. package/dist/src/sources/LocalFilesystemAdapter.helpers.js.map +1 -0
  86. package/dist/src/sources/LocalFilesystemAdapter.js +218 -159
  87. package/dist/src/sources/LocalFilesystemAdapter.js.map +1 -1
  88. package/dist/src/sources/LocalFilesystemAdapter.scan.d.ts +78 -0
  89. package/dist/src/sources/LocalFilesystemAdapter.scan.d.ts.map +1 -0
  90. package/dist/src/sources/LocalFilesystemAdapter.scan.js +118 -0
  91. package/dist/src/sources/LocalFilesystemAdapter.scan.js.map +1 -0
  92. package/dist/src/sources/index.d.ts +1 -1
  93. package/dist/src/sources/index.d.ts.map +1 -1
  94. package/dist/src/sources/index.js.map +1 -1
  95. package/dist/src/sources/types.d.ts +28 -0
  96. package/dist/src/sources/types.d.ts.map +1 -1
  97. package/dist/src/telemetry/tracer-imports.d.ts +13 -0
  98. package/dist/src/telemetry/tracer-imports.d.ts.map +1 -0
  99. package/dist/src/telemetry/tracer-imports.js +26 -0
  100. package/dist/src/telemetry/tracer-imports.js.map +1 -0
  101. package/dist/src/telemetry/tracer.d.ts.map +1 -1
  102. package/dist/src/telemetry/tracer.js +18 -21
  103. package/dist/src/telemetry/tracer.js.map +1 -1
  104. package/dist/src/utils/rate-limit.d.ts +39 -0
  105. package/dist/src/utils/rate-limit.d.ts.map +1 -0
  106. package/dist/src/utils/rate-limit.js +48 -0
  107. package/dist/src/utils/rate-limit.js.map +1 -0
  108. package/dist/src/utils/rate-limit.test.d.ts +11 -0
  109. package/dist/src/utils/rate-limit.test.d.ts.map +1 -0
  110. package/dist/src/utils/rate-limit.test.js +86 -0
  111. package/dist/src/utils/rate-limit.test.js.map +1 -0
  112. package/dist/src/webhooks/WebhookDeadLetterRepository.d.ts +178 -0
  113. package/dist/src/webhooks/WebhookDeadLetterRepository.d.ts.map +1 -0
  114. package/dist/src/webhooks/WebhookDeadLetterRepository.js +196 -0
  115. package/dist/src/webhooks/WebhookDeadLetterRepository.js.map +1 -0
  116. package/dist/src/webhooks/WebhookQueue.d.ts +1 -0
  117. package/dist/src/webhooks/WebhookQueue.d.ts.map +1 -1
  118. package/dist/src/webhooks/WebhookQueue.js +19 -0
  119. package/dist/src/webhooks/WebhookQueue.js.map +1 -1
  120. package/dist/src/webhooks/WebhookQueue.types.d.ts +11 -0
  121. package/dist/src/webhooks/WebhookQueue.types.d.ts.map +1 -1
  122. package/dist/src/webhooks/index.d.ts +1 -0
  123. package/dist/src/webhooks/index.d.ts.map +1 -1
  124. package/dist/src/webhooks/index.js +2 -0
  125. package/dist/src/webhooks/index.js.map +1 -1
  126. package/dist/src/webhooks/webhook-schemas.d.ts +117 -1212
  127. package/dist/src/webhooks/webhook-schemas.d.ts.map +1 -1
  128. package/dist/tests/ActivationManager.test.d.ts +13 -0
  129. package/dist/tests/ActivationManager.test.d.ts.map +1 -0
  130. package/dist/tests/ActivationManager.test.js +218 -0
  131. package/dist/tests/ActivationManager.test.js.map +1 -0
  132. package/dist/tests/LocalFilesystemAdapter.coverage.test.d.ts +13 -0
  133. package/dist/tests/LocalFilesystemAdapter.coverage.test.d.ts.map +1 -0
  134. package/dist/tests/LocalFilesystemAdapter.coverage.test.js +314 -0
  135. package/dist/tests/LocalFilesystemAdapter.coverage.test.js.map +1 -0
  136. package/dist/tests/LocalFilesystemAdapter.security.test.d.ts +18 -0
  137. package/dist/tests/LocalFilesystemAdapter.security.test.d.ts.map +1 -0
  138. package/dist/tests/LocalFilesystemAdapter.security.test.js +344 -0
  139. package/dist/tests/LocalFilesystemAdapter.security.test.js.map +1 -0
  140. package/dist/tests/LocalFilesystemAdapter.test.d.ts +12 -0
  141. package/dist/tests/LocalFilesystemAdapter.test.d.ts.map +1 -0
  142. package/dist/tests/LocalFilesystemAdapter.test.js +301 -0
  143. package/dist/tests/LocalFilesystemAdapter.test.js.map +1 -0
  144. package/dist/tests/ROIDashboardService.coverage.test.d.ts +9 -0
  145. package/dist/tests/ROIDashboardService.coverage.test.d.ts.map +1 -0
  146. package/dist/tests/ROIDashboardService.coverage.test.js +118 -0
  147. package/dist/tests/ROIDashboardService.coverage.test.js.map +1 -0
  148. package/dist/tests/ROIDashboardService.test.js +87 -0
  149. package/dist/tests/ROIDashboardService.test.js.map +1 -1
  150. package/dist/tests/ScraperAdapters.gitlab-coverage.test.d.ts +14 -0
  151. package/dist/tests/ScraperAdapters.gitlab-coverage.test.d.ts.map +1 -0
  152. package/dist/tests/ScraperAdapters.gitlab-coverage.test.js +169 -0
  153. package/dist/tests/ScraperAdapters.gitlab-coverage.test.js.map +1 -0
  154. package/dist/tests/ScraperAdapters.test.d.ts +5 -1
  155. package/dist/tests/ScraperAdapters.test.d.ts.map +1 -1
  156. package/dist/tests/ScraperAdapters.test.js +6 -336
  157. package/dist/tests/ScraperAdapters.test.js.map +1 -1
  158. package/dist/tests/WebhookDeadLetterRepository.test.d.ts +2 -0
  159. package/dist/tests/WebhookDeadLetterRepository.test.d.ts.map +1 -0
  160. package/dist/tests/WebhookDeadLetterRepository.test.js +333 -0
  161. package/dist/tests/WebhookDeadLetterRepository.test.js.map +1 -0
  162. package/dist/tests/WebhookHandler.test.js +93 -1
  163. package/dist/tests/WebhookHandler.test.js.map +1 -1
  164. package/dist/tests/WebhookQueue.coverage.test.d.ts +19 -0
  165. package/dist/tests/WebhookQueue.coverage.test.d.ts.map +1 -0
  166. package/dist/tests/WebhookQueue.coverage.test.js +190 -0
  167. package/dist/tests/WebhookQueue.coverage.test.js.map +1 -0
  168. package/dist/tests/billing/GDPRCompliance.test.d.ts +2 -2
  169. package/dist/tests/billing/GDPRCompliance.test.js +221 -36
  170. package/dist/tests/billing/GDPRCompliance.test.js.map +1 -1
  171. package/dist/tests/telemetry.test.js +126 -0
  172. package/dist/tests/telemetry.test.js.map +1 -1
  173. package/dist/tests/webhooks/WebhookDeadLetterRepository.test.d.ts +10 -0
  174. package/dist/tests/webhooks/WebhookDeadLetterRepository.test.d.ts.map +1 -0
  175. package/dist/tests/webhooks/WebhookDeadLetterRepository.test.js +109 -0
  176. package/dist/tests/webhooks/WebhookDeadLetterRepository.test.js.map +1 -0
  177. package/package.json +8 -3
@@ -0,0 +1,411 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { LanguageRouter } from './router.js';
3
+ // ---------------------------------------------------------------------------
4
+ // Stub helpers
5
+ // ---------------------------------------------------------------------------
6
+ const EMPTY_PARSE_RESULT = { imports: [], exports: [], functions: [] };
7
+ function makeAdapter(language, extensions, overrides = {}) {
8
+ return {
9
+ language,
10
+ extensions,
11
+ canHandle: vi.fn().mockImplementation((fp) => {
12
+ const ext = fp.slice(fp.lastIndexOf('.')).toLowerCase();
13
+ return extensions.includes(ext);
14
+ }),
15
+ parseFile: vi.fn().mockReturnValue(EMPTY_PARSE_RESULT),
16
+ getFrameworkRules: vi.fn().mockReturnValue([]),
17
+ dispose: vi.fn(),
18
+ ...overrides,
19
+ };
20
+ }
21
+ function makeMockMetrics() {
22
+ return {
23
+ recordFileParsed: vi.fn(),
24
+ recordParseDuration: vi.fn(),
25
+ recordError: vi.fn(),
26
+ getSnapshot: vi.fn().mockReturnValue({}),
27
+ reset: vi.fn(),
28
+ };
29
+ }
30
+ // ---------------------------------------------------------------------------
31
+ // registerAdapter / unregisterAdapter
32
+ // ---------------------------------------------------------------------------
33
+ describe('LanguageRouter.registerAdapter', () => {
34
+ it('makes the adapter retrievable by its extensions', () => {
35
+ const router = new LanguageRouter({ enableLanguageDetection: false });
36
+ router.registerAdapter(makeAdapter('python', ['.py', '.pyi']));
37
+ expect(router.tryGetAdapter('main.py')).not.toBeNull();
38
+ expect(router.tryGetAdapter('stubs.pyi')).not.toBeNull();
39
+ });
40
+ it('replacing an adapter removes old extension mappings', () => {
41
+ const router = new LanguageRouter({ enableLanguageDetection: false });
42
+ const first = makeAdapter('python', ['.py', '.pyi']);
43
+ const replacement = makeAdapter('python', ['.py']);
44
+ router.registerAdapter(first);
45
+ router.registerAdapter(replacement);
46
+ expect(router.tryGetAdapter('stubs.pyi')).toBeNull();
47
+ expect(router.tryGetAdapter('main.py')).not.toBeNull();
48
+ });
49
+ it('increments adapterCount', () => {
50
+ const router = new LanguageRouter({ enableLanguageDetection: false });
51
+ expect(router.adapterCount).toBe(0);
52
+ router.registerAdapter(makeAdapter('python', ['.py']));
53
+ expect(router.adapterCount).toBe(1);
54
+ router.registerAdapter(makeAdapter('go', ['.go']));
55
+ expect(router.adapterCount).toBe(2);
56
+ });
57
+ });
58
+ describe('LanguageRouter.unregisterAdapter', () => {
59
+ it('returns true and removes adapter and its extensions', () => {
60
+ const router = new LanguageRouter({ enableLanguageDetection: false });
61
+ router.registerAdapter(makeAdapter('python', ['.py', '.pyi']));
62
+ expect(router.unregisterAdapter('python')).toBe(true);
63
+ expect(router.tryGetAdapter('main.py')).toBeNull();
64
+ expect(router.adapterCount).toBe(0);
65
+ });
66
+ it('returns false for a language that was never registered', () => {
67
+ const router = new LanguageRouter({ enableLanguageDetection: false });
68
+ expect(router.unregisterAdapter('rust')).toBe(false);
69
+ });
70
+ });
71
+ // ---------------------------------------------------------------------------
72
+ // getAdapter
73
+ // ---------------------------------------------------------------------------
74
+ describe('LanguageRouter.getAdapter', () => {
75
+ it('returns the correct adapter for a registered extension', () => {
76
+ const router = new LanguageRouter({ enableLanguageDetection: false });
77
+ const adapter = makeAdapter('python', ['.py']);
78
+ router.registerAdapter(adapter);
79
+ expect(router.getAdapter('src/main.py')).toBe(adapter);
80
+ });
81
+ it('is case-insensitive for extension matching', () => {
82
+ const router = new LanguageRouter({ enableLanguageDetection: false });
83
+ const adapter = makeAdapter('python', ['.py']);
84
+ router.registerAdapter(adapter);
85
+ expect(router.getAdapter('src/MAIN.PY')).toBe(adapter);
86
+ });
87
+ it('throws for an unknown extension', () => {
88
+ const router = new LanguageRouter({ enableLanguageDetection: false });
89
+ expect(() => router.getAdapter('file.xyz')).toThrow(/No adapter registered for extension/);
90
+ });
91
+ it('includes supported extensions in the error when throwOnUnsupported is true', () => {
92
+ const router = new LanguageRouter({
93
+ throwOnUnsupported: true,
94
+ enableLanguageDetection: false,
95
+ });
96
+ router.registerAdapter(makeAdapter('python', ['.py']));
97
+ expect(() => router.getAdapter('file.xyz')).toThrow(/Supported extensions/);
98
+ });
99
+ });
100
+ // ---------------------------------------------------------------------------
101
+ // tryGetAdapter
102
+ // ---------------------------------------------------------------------------
103
+ describe('LanguageRouter.tryGetAdapter', () => {
104
+ it('returns the adapter for a known extension', () => {
105
+ const router = new LanguageRouter({ enableLanguageDetection: false });
106
+ const adapter = makeAdapter('go', ['.go']);
107
+ router.registerAdapter(adapter);
108
+ expect(router.tryGetAdapter('cmd/main.go')).toBe(adapter);
109
+ });
110
+ it('returns null for an unknown extension', () => {
111
+ const router = new LanguageRouter({ enableLanguageDetection: false });
112
+ expect(router.tryGetAdapter('file.xyz')).toBeNull();
113
+ });
114
+ it('returns null for an extensionless file when no content is provided', () => {
115
+ const router = new LanguageRouter({ enableLanguageDetection: true });
116
+ router.registerAdapter(makeAdapter('python', ['.py']));
117
+ expect(router.tryGetAdapter('Makefile')).toBeNull();
118
+ });
119
+ it('returns null for an extensionless file when language detection is disabled', () => {
120
+ const router = new LanguageRouter({ enableLanguageDetection: false });
121
+ router.registerAdapter(makeAdapter('python', ['.py']));
122
+ expect(router.tryGetAdapter('Makefile', 'print("hello")')).toBeNull();
123
+ });
124
+ it('returns an adapter via content detection for an extensionless file', () => {
125
+ const router = new LanguageRouter({
126
+ enableLanguageDetection: true,
127
+ detectionMinConfidence: 0.5,
128
+ });
129
+ const adapter = makeAdapter('python', ['.py']);
130
+ router.registerAdapter(adapter);
131
+ // Python shebang gives confidence 1.0
132
+ const result = router.tryGetAdapter('run', '#!/usr/bin/env python3\nprint("hello")');
133
+ expect(result).toBe(adapter);
134
+ });
135
+ });
136
+ // ---------------------------------------------------------------------------
137
+ // detectLanguageFromContent
138
+ // ---------------------------------------------------------------------------
139
+ describe('LanguageRouter.detectLanguageFromContent', () => {
140
+ it('returns language=null with method=none when detection is disabled', () => {
141
+ const router = new LanguageRouter({ enableLanguageDetection: false });
142
+ const result = router.detectLanguageFromContent('print("hello")');
143
+ expect(result.language).toBeNull();
144
+ expect(result.method).toBe('none');
145
+ });
146
+ it('detects Python from a shebang line', () => {
147
+ const router = new LanguageRouter({ enableLanguageDetection: true });
148
+ const result = router.detectLanguageFromContent('#!/usr/bin/env python3\nprint("hello")');
149
+ expect(result.language).toBe('python');
150
+ expect(result.confidence).toBeGreaterThan(0);
151
+ });
152
+ });
153
+ // ---------------------------------------------------------------------------
154
+ // tryGetAdapterFromContent
155
+ // ---------------------------------------------------------------------------
156
+ describe('LanguageRouter.tryGetAdapterFromContent', () => {
157
+ it('returns the adapter when a language is detected', () => {
158
+ const router = new LanguageRouter({ enableLanguageDetection: true });
159
+ const adapter = makeAdapter('python', ['.py']);
160
+ router.registerAdapter(adapter);
161
+ const { adapter: found, detection } = router.tryGetAdapterFromContent('#!/usr/bin/env python3\nprint("hello")');
162
+ expect(found).toBe(adapter);
163
+ expect(detection.language).toBe('python');
164
+ });
165
+ it('returns null adapter when language cannot be detected', () => {
166
+ const router = new LanguageRouter({ enableLanguageDetection: true });
167
+ const { adapter, detection } = router.tryGetAdapterFromContent('hello world');
168
+ expect(adapter).toBeNull();
169
+ expect(detection.language).toBeNull();
170
+ });
171
+ it('returns null adapter when the detected language has no registered adapter', () => {
172
+ const router = new LanguageRouter({ enableLanguageDetection: true });
173
+ // No adapters registered — detected language will have no adapter
174
+ const { adapter } = router.tryGetAdapterFromContent('#!/usr/bin/env python3\nprint("hi")');
175
+ expect(adapter).toBeNull();
176
+ });
177
+ });
178
+ // ---------------------------------------------------------------------------
179
+ // canHandle / getLanguage
180
+ // ---------------------------------------------------------------------------
181
+ describe('LanguageRouter.canHandle', () => {
182
+ it('returns true for a registered extension', () => {
183
+ const router = new LanguageRouter({ enableLanguageDetection: false });
184
+ router.registerAdapter(makeAdapter('go', ['.go']));
185
+ expect(router.canHandle('main.go')).toBe(true);
186
+ });
187
+ it('returns false for an unregistered extension', () => {
188
+ const router = new LanguageRouter({ enableLanguageDetection: false });
189
+ expect(router.canHandle('main.xyz')).toBe(false);
190
+ });
191
+ });
192
+ describe('LanguageRouter.getLanguage', () => {
193
+ it('returns the language for a registered file extension', () => {
194
+ const router = new LanguageRouter({ enableLanguageDetection: false });
195
+ router.registerAdapter(makeAdapter('go', ['.go']));
196
+ expect(router.getLanguage('cmd/main.go')).toBe('go');
197
+ });
198
+ it('returns null for an unregistered file extension', () => {
199
+ const router = new LanguageRouter({ enableLanguageDetection: false });
200
+ expect(router.getLanguage('file.xyz')).toBeNull();
201
+ });
202
+ });
203
+ // ---------------------------------------------------------------------------
204
+ // parseFile
205
+ // ---------------------------------------------------------------------------
206
+ describe('LanguageRouter.parseFile', () => {
207
+ let metrics;
208
+ let router;
209
+ beforeEach(() => {
210
+ metrics = makeMockMetrics();
211
+ router = new LanguageRouter({ metrics, enableLanguageDetection: false });
212
+ });
213
+ it('delegates to the adapter and returns its result', () => {
214
+ const parseResult = {
215
+ imports: [{ module: 'os', namedImports: [], isTypeOnly: false, sourceFile: 'src/main.py' }],
216
+ exports: [],
217
+ functions: [],
218
+ };
219
+ const adapter = makeAdapter('python', ['.py'], {
220
+ parseFile: vi.fn().mockReturnValue(parseResult),
221
+ });
222
+ router.registerAdapter(adapter);
223
+ const result = router.parseFile('import os', 'src/main.py');
224
+ expect(result).toBe(parseResult);
225
+ });
226
+ it('calls recordFileParsed and recordParseDuration on success', () => {
227
+ router.registerAdapter(makeAdapter('python', ['.py']));
228
+ router.parseFile('import os', 'main.py');
229
+ expect(metrics.recordFileParsed).toHaveBeenCalledWith('python');
230
+ expect(metrics.recordParseDuration).toHaveBeenCalledWith('python', expect.any(Number));
231
+ });
232
+ it('calls recordError and re-throws when the adapter throws', () => {
233
+ const adapter = makeAdapter('python', ['.py'], {
234
+ parseFile: vi.fn().mockImplementation(() => {
235
+ throw new Error('parse failure');
236
+ }),
237
+ });
238
+ router.registerAdapter(adapter);
239
+ expect(() => router.parseFile('bad code', 'main.py')).toThrow('parse failure');
240
+ expect(metrics.recordError).toHaveBeenCalledWith('parse_error', 'python');
241
+ });
242
+ it('still records parse duration even when the adapter throws', () => {
243
+ const adapter = makeAdapter('python', ['.py'], {
244
+ parseFile: vi.fn().mockImplementation(() => {
245
+ throw new Error('boom');
246
+ }),
247
+ });
248
+ router.registerAdapter(adapter);
249
+ expect(() => router.parseFile('', 'main.py')).toThrow();
250
+ expect(metrics.recordParseDuration).toHaveBeenCalledWith('python', expect.any(Number));
251
+ });
252
+ it('throws for a file with no registered adapter', () => {
253
+ expect(() => router.parseFile('content', 'file.xyz')).toThrow(/No adapter registered for extension/);
254
+ });
255
+ });
256
+ // ---------------------------------------------------------------------------
257
+ // getSupportedLanguages / getSupportedExtensions / getAdapterByLanguage
258
+ // ---------------------------------------------------------------------------
259
+ describe('LanguageRouter.getSupportedLanguages', () => {
260
+ it('returns only registered languages', () => {
261
+ const router = new LanguageRouter({ enableLanguageDetection: false });
262
+ router.registerAdapter(makeAdapter('python', ['.py']));
263
+ router.registerAdapter(makeAdapter('go', ['.go']));
264
+ const langs = router.getSupportedLanguages();
265
+ expect(langs).toContain('python');
266
+ expect(langs).toContain('go');
267
+ expect(langs).toHaveLength(2);
268
+ });
269
+ it('returns an empty array when no adapters are registered', () => {
270
+ const router = new LanguageRouter({ enableLanguageDetection: false });
271
+ expect(router.getSupportedLanguages()).toEqual([]);
272
+ });
273
+ });
274
+ describe('LanguageRouter.getSupportedExtensions', () => {
275
+ it('returns all extensions from all registered adapters', () => {
276
+ const router = new LanguageRouter({ enableLanguageDetection: false });
277
+ router.registerAdapter(makeAdapter('python', ['.py', '.pyi']));
278
+ router.registerAdapter(makeAdapter('go', ['.go']));
279
+ const exts = router.getSupportedExtensions();
280
+ expect(exts).toContain('.py');
281
+ expect(exts).toContain('.pyi');
282
+ expect(exts).toContain('.go');
283
+ });
284
+ });
285
+ describe('LanguageRouter.getAdapterByLanguage', () => {
286
+ it('returns the adapter for a registered language', () => {
287
+ const router = new LanguageRouter({ enableLanguageDetection: false });
288
+ const adapter = makeAdapter('python', ['.py']);
289
+ router.registerAdapter(adapter);
290
+ expect(router.getAdapterByLanguage('python')).toBe(adapter);
291
+ });
292
+ it('returns undefined for an unregistered language', () => {
293
+ const router = new LanguageRouter({ enableLanguageDetection: false });
294
+ expect(router.getAdapterByLanguage('rust')).toBeUndefined();
295
+ });
296
+ });
297
+ // ---------------------------------------------------------------------------
298
+ // getAllFrameworkRules / getFrameworkRules
299
+ // ---------------------------------------------------------------------------
300
+ describe('LanguageRouter.getAllFrameworkRules', () => {
301
+ it('aggregates rules from all registered adapters', () => {
302
+ const router = new LanguageRouter({ enableLanguageDetection: false });
303
+ const rule1 = { name: 'django', depIndicators: ['django'], importIndicators: [] };
304
+ const rule2 = { name: 'gin', depIndicators: ['gin'], importIndicators: [] };
305
+ router.registerAdapter(makeAdapter('python', ['.py'], { getFrameworkRules: vi.fn().mockReturnValue([rule1]) }));
306
+ router.registerAdapter(makeAdapter('go', ['.go'], { getFrameworkRules: vi.fn().mockReturnValue([rule2]) }));
307
+ const rules = router.getAllFrameworkRules();
308
+ expect(rules).toContain(rule1);
309
+ expect(rules).toContain(rule2);
310
+ });
311
+ it('returns an empty array when no adapters are registered', () => {
312
+ const router = new LanguageRouter({ enableLanguageDetection: false });
313
+ expect(router.getAllFrameworkRules()).toEqual([]);
314
+ });
315
+ });
316
+ describe('LanguageRouter.getFrameworkRules', () => {
317
+ it('returns rules for a specific registered language', () => {
318
+ const router = new LanguageRouter({ enableLanguageDetection: false });
319
+ const rule = { name: 'django', depIndicators: ['django'], importIndicators: [] };
320
+ router.registerAdapter(makeAdapter('python', ['.py'], { getFrameworkRules: vi.fn().mockReturnValue([rule]) }));
321
+ expect(router.getFrameworkRules('python')).toContain(rule);
322
+ });
323
+ it('returns an empty array for an unregistered language', () => {
324
+ const router = new LanguageRouter({ enableLanguageDetection: false });
325
+ expect(router.getFrameworkRules('rust')).toEqual([]);
326
+ });
327
+ });
328
+ // ---------------------------------------------------------------------------
329
+ // dispose
330
+ // ---------------------------------------------------------------------------
331
+ describe('LanguageRouter.dispose', () => {
332
+ it('calls dispose on every registered adapter', () => {
333
+ const router = new LanguageRouter({ enableLanguageDetection: false });
334
+ const pyAdapter = makeAdapter('python', ['.py']);
335
+ const goAdapter = makeAdapter('go', ['.go']);
336
+ router.registerAdapter(pyAdapter);
337
+ router.registerAdapter(goAdapter);
338
+ router.dispose();
339
+ expect(pyAdapter.dispose).toHaveBeenCalled();
340
+ expect(goAdapter.dispose).toHaveBeenCalled();
341
+ });
342
+ it('clears the adapter registry after disposal', () => {
343
+ const router = new LanguageRouter({ enableLanguageDetection: false });
344
+ router.registerAdapter(makeAdapter('python', ['.py']));
345
+ router.dispose();
346
+ expect(router.adapterCount).toBe(0);
347
+ expect(router.tryGetAdapter('main.py')).toBeNull();
348
+ });
349
+ it('does not throw if an adapter dispose method throws', () => {
350
+ const router = new LanguageRouter({ enableLanguageDetection: false });
351
+ router.registerAdapter(makeAdapter('python', ['.py'], {
352
+ dispose: vi.fn().mockImplementation(() => {
353
+ throw new Error('cleanup error');
354
+ }),
355
+ }));
356
+ expect(() => router.dispose()).not.toThrow();
357
+ });
358
+ });
359
+ // ---------------------------------------------------------------------------
360
+ // createWithAllAdapters (factory integration)
361
+ // ---------------------------------------------------------------------------
362
+ describe('LanguageRouter.createWithAllAdapters', () => {
363
+ it('registers adapters for all supported languages by default', () => {
364
+ const router = LanguageRouter.createWithAllAdapters({ enableLanguageDetection: false });
365
+ const langs = router.getSupportedLanguages();
366
+ expect(langs).toContain('typescript');
367
+ expect(langs).toContain('python');
368
+ expect(langs).toContain('go');
369
+ expect(router.adapterCount).toBeGreaterThan(0);
370
+ });
371
+ it('registers only the specified languages when the languages option is set', () => {
372
+ const router = LanguageRouter.createWithAllAdapters({
373
+ languages: ['python', 'go'],
374
+ enableLanguageDetection: false,
375
+ });
376
+ expect(router.getSupportedLanguages()).toContain('python');
377
+ expect(router.getSupportedLanguages()).toContain('go');
378
+ expect(router.getSupportedLanguages()).not.toContain('typescript');
379
+ });
380
+ it('handles TypeScript files after creation', () => {
381
+ const router = LanguageRouter.createWithAllAdapters({ enableLanguageDetection: false });
382
+ expect(router.canHandle('app.ts')).toBe(true);
383
+ expect(router.canHandle('component.tsx')).toBe(true);
384
+ });
385
+ it('handles Python files after creation', () => {
386
+ const router = LanguageRouter.createWithAllAdapters({ enableLanguageDetection: false });
387
+ expect(router.canHandle('main.py')).toBe(true);
388
+ });
389
+ it('handles Go files after creation', () => {
390
+ const router = LanguageRouter.createWithAllAdapters({ enableLanguageDetection: false });
391
+ expect(router.canHandle('main.go')).toBe(true);
392
+ });
393
+ });
394
+ // ---------------------------------------------------------------------------
395
+ // createWithCachedAdapters (factory integration)
396
+ // ---------------------------------------------------------------------------
397
+ describe('LanguageRouter.createWithCachedAdapters', () => {
398
+ it('creates a fully functional router', () => {
399
+ const router = LanguageRouter.createWithCachedAdapters({ enableLanguageDetection: false });
400
+ expect(router.adapterCount).toBeGreaterThan(0);
401
+ expect(router.canHandle('main.py')).toBe(true);
402
+ });
403
+ it('with languages option, only registers specified languages', () => {
404
+ const router = LanguageRouter.createWithCachedAdapters({
405
+ languages: ['go'],
406
+ enableLanguageDetection: false,
407
+ });
408
+ expect(router.getSupportedLanguages()).toEqual(['go']);
409
+ });
410
+ });
411
+ //# sourceMappingURL=router.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.test.js","sourceRoot":"","sources":["../../../src/analysis/router.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../../src/analysis/tree-sitter/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,cAAc,GAAG,cAAc,CAAA;IACnE,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAAA;IAC/C,MAAM,IAAI,IAAI,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAA;IACxB,MAAM,IAAI,IAAI,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9C,WAAW,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5C,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,aAAa,EAAE,cAAc,EAAE,CAAA;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAA;IAC3C,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAA;IAChD,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAA;IAC3D,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,CAAA;CAC9D;AAED;;GAEG;AAEH,MAAM,WAAW,kBAAkB;CAElC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAsD;IACrE,OAAO,CAAC,OAAO,CAA+D;IAC9E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,WAAW,CAA4C;IAE/D,OAAO,CAAC,WAAW,CAA0B;gBAEjC,OAAO,GAAE,wBAA6B;IAIlD;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAYnB,YAAY;IAuB1B;;;;;;;;;;;;;;;OAeG;IACG,SAAS,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA4CvE;;OAEG;YACW,UAAU;IAYxB;;OAEG;YACW,kBAAkB;IA0ChC;;;;;OAKG;IACG,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IASxE;;OAEG;IACH,kBAAkB,IAAI,iBAAiB,EAAE;IAIzC;;;;;OAKG;IACH,OAAO,IAAI,IAAI;CAgBhB"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../../src/analysis/tree-sitter/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,cAAc,GAAG,cAAc,CAAA;IACnE,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAAA;IAC/C,MAAM,IAAI,IAAI,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAA;IACxB,MAAM,IAAI,IAAI,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9C,WAAW,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5C,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,aAAa,EAAE,cAAc,EAAE,CAAA;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAA;IAC3C,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAA;IAChD,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAA;IAC3D,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,CAAA;CAC9D;AAED;;GAEG;AAEH,MAAM,WAAW,kBAAkB;CAElC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAsD;IACrE,OAAO,CAAC,OAAO,CAA+D;IAC9E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,WAAW,CAA4C;IAE/D,OAAO,CAAC,WAAW,CAA0B;gBAEjC,OAAO,GAAE,wBAA6B;IAIlD;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAYnB,YAAY;IAiC1B;;;;;;;;;;;;;;;OAeG;IACG,SAAS,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA4CvE;;OAEG;YACW,UAAU;IAYxB;;OAEG;YACW,kBAAkB;IA0ChC;;;;;OAKG;IACG,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IASxE;;OAEG;IACH,kBAAkB,IAAI,iBAAiB,EAAE;IAIzC;;;;;OAKG;IACH,OAAO,IAAI,IAAI;CAgBhB"}
@@ -62,11 +62,18 @@ export class TreeSitterManager {
62
62
  }
63
63
  async doInitialize() {
64
64
  try {
65
- // Dynamic import for web-tree-sitter (WASM-based)
66
- // @ts-expect-error - Optional dependency, may not have type declarations
67
- const TreeSitter = await import('web-tree-sitter');
68
- await TreeSitter.default.init();
69
- this.ParserClass = TreeSitter.default;
65
+ // Dynamic import for web-tree-sitter (WASM-based). Newer versions (>=0.25)
66
+ // expose named exports; fall back to a default export for older builds.
67
+ const TreeSitter = (await import('web-tree-sitter'));
68
+ const ParserCtor = TreeSitter.Parser ?? TreeSitter.default;
69
+ if (!ParserCtor) {
70
+ throw new Error('web-tree-sitter Parser export not found');
71
+ }
72
+ const maybeInit = ParserCtor.init;
73
+ if (typeof maybeInit === 'function') {
74
+ await maybeInit.call(ParserCtor);
75
+ }
76
+ this.ParserClass = ParserCtor;
70
77
  this.initialized = true;
71
78
  }
72
79
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/analysis/tree-sitter/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/analysis/tree-sitter/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * SMI-4293: Python query-based extraction
3
+ *
4
+ * Uses tree-sitter queries to extract imports, exports, and functions from
5
+ * a parsed Python AST, producing the same ParseResult shape as the regex
6
+ * fallback. Regression guard (finding H3): the query extractor must produce
7
+ * a superset-or-equal result set compared to the regex baseline on every
8
+ * fixture. Tests enforce that invariant.
9
+ *
10
+ * @see docs/internal/implementation/github-wave-5c-tree-sitter-incremental.md
11
+ * @module analysis/tree-sitter/pythonExtractor
12
+ */
13
+ import type { ParseResult } from '../types.js';
14
+ import type { TreeSitterLanguage, TreeSitterNode, TreeSitterTree } from './manager.js';
15
+ /** Minimal subset of the web-tree-sitter Query API we rely on. */
16
+ export interface TreeSitterQuery {
17
+ captures(node: TreeSitterNode): Array<{
18
+ name: string;
19
+ node: TreeSitterNode;
20
+ }>;
21
+ }
22
+ /** Constructor signature for the Query class (imported from web-tree-sitter). */
23
+ export type QueryCtor = new (lang: TreeSitterLanguage, src: string) => TreeSitterQuery;
24
+ /**
25
+ * Lazily compile and cache all Python queries for a given Language module.
26
+ * Queries are expensive to construct (parse the DSL); compiled once per
27
+ * Language and reused across parses.
28
+ */
29
+ export declare class PythonQuerySet {
30
+ readonly imports: TreeSitterQuery;
31
+ readonly fromImports: TreeSitterQuery;
32
+ readonly functions: TreeSitterQuery;
33
+ readonly classes: TreeSitterQuery;
34
+ readonly allExports: TreeSitterQuery;
35
+ constructor(Query: QueryCtor, lang: TreeSitterLanguage);
36
+ }
37
+ /**
38
+ * Extract a ParseResult from a Python parse tree using tree-sitter queries.
39
+ *
40
+ * This replaces the regex fallback in the query-based code path. It MUST
41
+ * produce results that are a superset or equal set of the regex extraction
42
+ * for every fixture (finding H3).
43
+ */
44
+ export declare function extractPythonParseResult(tree: TreeSitterTree, queries: PythonQuerySet, filePath: string): ParseResult;
45
+ //# sourceMappingURL=pythonExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pythonExtractor.d.ts","sourceRoot":"","sources":["../../../../src/analysis/tree-sitter/pythonExtractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAwC,MAAM,aAAa,CAAA;AACpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAStF,kEAAkE;AAClE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,cAAc,CAAA;KAAE,CAAC,CAAA;CAC9E;AAED,iFAAiF;AACjF,MAAM,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,KAAK,eAAe,CAAA;AAEtF;;;;GAIG;AACH,qBAAa,cAAc;IACzB,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;IACjC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAA;IACrC,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAA;IACnC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;IACjC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAA;gBAExB,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,kBAAkB;CAOvD;AAQD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,GACf,WAAW,CAUb"}