@gulibs/safe-coder 0.0.25 → 0.0.27

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 (188) hide show
  1. package/README.md +682 -902
  2. package/dist/cache/cache-manager.d.ts +71 -0
  3. package/dist/cache/cache-manager.d.ts.map +1 -0
  4. package/dist/cache/cache-manager.js +244 -0
  5. package/dist/cache/cache-manager.js.map +1 -0
  6. package/dist/executor/cli-executor.d.ts +106 -0
  7. package/dist/executor/cli-executor.d.ts.map +1 -0
  8. package/dist/executor/cli-executor.js +133 -0
  9. package/dist/executor/cli-executor.js.map +1 -0
  10. package/dist/executor/dependency-checker.d.ts +23 -0
  11. package/dist/executor/dependency-checker.d.ts.map +1 -0
  12. package/dist/executor/dependency-checker.js +62 -0
  13. package/dist/executor/dependency-checker.js.map +1 -0
  14. package/dist/index.js +3 -4
  15. package/dist/index.js.map +1 -1
  16. package/dist/processor/content-processor.d.ts +76 -0
  17. package/dist/processor/content-processor.d.ts.map +1 -0
  18. package/dist/processor/content-processor.js +182 -0
  19. package/dist/processor/content-processor.js.map +1 -0
  20. package/dist/processor/guide-generator.d.ts +68 -0
  21. package/dist/processor/guide-generator.d.ts.map +1 -0
  22. package/dist/processor/guide-generator.js +189 -0
  23. package/dist/processor/guide-generator.js.map +1 -0
  24. package/dist/server/safe-coder-mcp.d.ts +18 -0
  25. package/dist/server/safe-coder-mcp.d.ts.map +1 -0
  26. package/dist/server/safe-coder-mcp.js +164 -0
  27. package/dist/server/safe-coder-mcp.js.map +1 -0
  28. package/dist/tools/cache-tools.d.ts +42 -0
  29. package/dist/tools/cache-tools.d.ts.map +1 -0
  30. package/dist/tools/cache-tools.js +70 -0
  31. package/dist/tools/cache-tools.js.map +1 -0
  32. package/dist/tools/crawl-documentation.d.ts +57 -0
  33. package/dist/tools/crawl-documentation.d.ts.map +1 -0
  34. package/dist/tools/crawl-documentation.js +96 -0
  35. package/dist/tools/crawl-documentation.js.map +1 -0
  36. package/dist/tools/index.d.ts +4 -0
  37. package/dist/tools/index.d.ts.map +1 -0
  38. package/dist/tools/index.js +4 -0
  39. package/dist/tools/index.js.map +1 -0
  40. package/dist/tools/save-skill.d.ts +49 -0
  41. package/dist/tools/save-skill.d.ts.map +1 -0
  42. package/dist/tools/save-skill.js +207 -0
  43. package/dist/tools/save-skill.js.map +1 -0
  44. package/package.json +18 -22
  45. package/dist/documentation/browser-doc-browser.d.ts +0 -41
  46. package/dist/documentation/browser-doc-browser.d.ts.map +0 -1
  47. package/dist/documentation/browser-doc-browser.js +0 -357
  48. package/dist/documentation/browser-doc-browser.js.map +0 -1
  49. package/dist/documentation/cache.d.ts +0 -13
  50. package/dist/documentation/cache.d.ts.map +0 -1
  51. package/dist/documentation/cache.js +0 -48
  52. package/dist/documentation/cache.js.map +0 -1
  53. package/dist/documentation/checkpoint-manager.d.ts +0 -38
  54. package/dist/documentation/checkpoint-manager.d.ts.map +0 -1
  55. package/dist/documentation/checkpoint-manager.js +0 -101
  56. package/dist/documentation/checkpoint-manager.js.map +0 -1
  57. package/dist/documentation/doc-crawler.d.ts +0 -185
  58. package/dist/documentation/doc-crawler.d.ts.map +0 -1
  59. package/dist/documentation/doc-crawler.js +0 -1162
  60. package/dist/documentation/doc-crawler.js.map +0 -1
  61. package/dist/documentation/github-client.d.ts +0 -13
  62. package/dist/documentation/github-client.d.ts.map +0 -1
  63. package/dist/documentation/github-client.js +0 -90
  64. package/dist/documentation/github-client.js.map +0 -1
  65. package/dist/documentation/http-fetcher.d.ts +0 -8
  66. package/dist/documentation/http-fetcher.d.ts.map +0 -1
  67. package/dist/documentation/http-fetcher.js +0 -31
  68. package/dist/documentation/http-fetcher.js.map +0 -1
  69. package/dist/documentation/index.d.ts +0 -16
  70. package/dist/documentation/index.d.ts.map +0 -1
  71. package/dist/documentation/index.js +0 -159
  72. package/dist/documentation/index.js.map +0 -1
  73. package/dist/documentation/llms-txt/detector.d.ts +0 -31
  74. package/dist/documentation/llms-txt/detector.d.ts.map +0 -1
  75. package/dist/documentation/llms-txt/detector.js +0 -77
  76. package/dist/documentation/llms-txt/detector.js.map +0 -1
  77. package/dist/documentation/llms-txt/downloader.d.ts +0 -30
  78. package/dist/documentation/llms-txt/downloader.d.ts.map +0 -1
  79. package/dist/documentation/llms-txt/downloader.js +0 -84
  80. package/dist/documentation/llms-txt/downloader.js.map +0 -1
  81. package/dist/documentation/llms-txt/index.d.ts +0 -4
  82. package/dist/documentation/llms-txt/index.d.ts.map +0 -1
  83. package/dist/documentation/llms-txt/index.js +0 -4
  84. package/dist/documentation/llms-txt/index.js.map +0 -1
  85. package/dist/documentation/llms-txt/parser.d.ts +0 -43
  86. package/dist/documentation/llms-txt/parser.d.ts.map +0 -1
  87. package/dist/documentation/llms-txt/parser.js +0 -177
  88. package/dist/documentation/llms-txt/parser.js.map +0 -1
  89. package/dist/documentation/normalizer.d.ts +0 -6
  90. package/dist/documentation/normalizer.d.ts.map +0 -1
  91. package/dist/documentation/normalizer.js +0 -38
  92. package/dist/documentation/normalizer.js.map +0 -1
  93. package/dist/documentation/npm-client.d.ts +0 -19
  94. package/dist/documentation/npm-client.d.ts.map +0 -1
  95. package/dist/documentation/npm-client.js +0 -182
  96. package/dist/documentation/npm-client.js.map +0 -1
  97. package/dist/documentation/skill-generator.d.ts +0 -108
  98. package/dist/documentation/skill-generator.d.ts.map +0 -1
  99. package/dist/documentation/skill-generator.js +0 -642
  100. package/dist/documentation/skill-generator.js.map +0 -1
  101. package/dist/documentation/web-doc-browser.d.ts +0 -67
  102. package/dist/documentation/web-doc-browser.d.ts.map +0 -1
  103. package/dist/documentation/web-doc-browser.js +0 -555
  104. package/dist/documentation/web-doc-browser.js.map +0 -1
  105. package/dist/errors/api-validator.d.ts +0 -9
  106. package/dist/errors/api-validator.d.ts.map +0 -1
  107. package/dist/errors/api-validator.js +0 -57
  108. package/dist/errors/api-validator.js.map +0 -1
  109. package/dist/errors/contextual-analysis.d.ts +0 -14
  110. package/dist/errors/contextual-analysis.d.ts.map +0 -1
  111. package/dist/errors/contextual-analysis.js +0 -173
  112. package/dist/errors/contextual-analysis.js.map +0 -1
  113. package/dist/errors/cross-file-analyzer.d.ts +0 -16
  114. package/dist/errors/cross-file-analyzer.d.ts.map +0 -1
  115. package/dist/errors/cross-file-analyzer.js +0 -172
  116. package/dist/errors/cross-file-analyzer.js.map +0 -1
  117. package/dist/errors/eslint-integration.d.ts +0 -9
  118. package/dist/errors/eslint-integration.d.ts.map +0 -1
  119. package/dist/errors/eslint-integration.js +0 -131
  120. package/dist/errors/eslint-integration.js.map +0 -1
  121. package/dist/errors/framework-detector.d.ts +0 -10
  122. package/dist/errors/framework-detector.d.ts.map +0 -1
  123. package/dist/errors/framework-detector.js +0 -126
  124. package/dist/errors/framework-detector.js.map +0 -1
  125. package/dist/errors/index.d.ts +0 -18
  126. package/dist/errors/index.d.ts.map +0 -1
  127. package/dist/errors/index.js +0 -134
  128. package/dist/errors/index.js.map +0 -1
  129. package/dist/errors/pattern-matcher.d.ts +0 -25
  130. package/dist/errors/pattern-matcher.d.ts.map +0 -1
  131. package/dist/errors/pattern-matcher.js +0 -44
  132. package/dist/errors/pattern-matcher.js.map +0 -1
  133. package/dist/errors/patterns.d.ts +0 -11
  134. package/dist/errors/patterns.d.ts.map +0 -1
  135. package/dist/errors/patterns.js +0 -351
  136. package/dist/errors/patterns.js.map +0 -1
  137. package/dist/errors/performance-detector.d.ts +0 -11
  138. package/dist/errors/performance-detector.d.ts.map +0 -1
  139. package/dist/errors/performance-detector.js +0 -119
  140. package/dist/errors/performance-detector.js.map +0 -1
  141. package/dist/errors/runtime-detector.d.ts +0 -7
  142. package/dist/errors/runtime-detector.d.ts.map +0 -1
  143. package/dist/errors/runtime-detector.js +0 -86
  144. package/dist/errors/runtime-detector.js.map +0 -1
  145. package/dist/errors/security-detector.d.ts +0 -6
  146. package/dist/errors/security-detector.d.ts.map +0 -1
  147. package/dist/errors/security-detector.js +0 -75
  148. package/dist/errors/security-detector.js.map +0 -1
  149. package/dist/errors/typescript-integration.d.ts +0 -6
  150. package/dist/errors/typescript-integration.d.ts.map +0 -1
  151. package/dist/errors/typescript-integration.js +0 -46
  152. package/dist/errors/typescript-integration.js.map +0 -1
  153. package/dist/server/mcp-server.d.ts +0 -14
  154. package/dist/server/mcp-server.d.ts.map +0 -1
  155. package/dist/server/mcp-server.js +0 -776
  156. package/dist/server/mcp-server.js.map +0 -1
  157. package/dist/types/documentation.d.ts +0 -26
  158. package/dist/types/documentation.d.ts.map +0 -1
  159. package/dist/types/documentation.js +0 -2
  160. package/dist/types/documentation.js.map +0 -1
  161. package/dist/utils/config.d.ts +0 -21
  162. package/dist/utils/config.d.ts.map +0 -1
  163. package/dist/utils/config.js +0 -34
  164. package/dist/utils/config.js.map +0 -1
  165. package/dist/utils/http-client.d.ts +0 -17
  166. package/dist/utils/http-client.d.ts.map +0 -1
  167. package/dist/utils/http-client.js +0 -62
  168. package/dist/utils/http-client.js.map +0 -1
  169. package/dist/utils/logger.d.ts +0 -36
  170. package/dist/utils/logger.d.ts.map +0 -1
  171. package/dist/utils/logger.js +0 -128
  172. package/dist/utils/logger.js.map +0 -1
  173. package/dist/utils/rate-limiter.d.ts +0 -9
  174. package/dist/utils/rate-limiter.d.ts.map +0 -1
  175. package/dist/utils/rate-limiter.js +0 -26
  176. package/dist/utils/rate-limiter.js.map +0 -1
  177. package/dist/validation/auto-fix.d.ts +0 -15
  178. package/dist/validation/auto-fix.d.ts.map +0 -1
  179. package/dist/validation/auto-fix.js +0 -49
  180. package/dist/validation/auto-fix.js.map +0 -1
  181. package/dist/validation/index.d.ts +0 -21
  182. package/dist/validation/index.d.ts.map +0 -1
  183. package/dist/validation/index.js +0 -45
  184. package/dist/validation/index.js.map +0 -1
  185. package/dist/validation/resolution-db.d.ts +0 -15
  186. package/dist/validation/resolution-db.d.ts.map +0 -1
  187. package/dist/validation/resolution-db.js +0 -62
  188. package/dist/validation/resolution-db.js.map +0 -1
@@ -1,555 +0,0 @@
1
- import { HttpClient } from '../utils/http-client.js';
2
- import { logger } from '../utils/logger.js';
3
- export class WebDocumentationBrowser {
4
- httpClient;
5
- DOCUMENTATION_INDICATORS = [
6
- // URL patterns
7
- /\/docs?\//i,
8
- /\/documentation/i,
9
- /\/guide/i,
10
- /\/tutorial/i,
11
- /\/api/i,
12
- /\/reference/i,
13
- /\/manual/i,
14
- /\/help/i,
15
- /\/about/i,
16
- /\/getting-started/i,
17
- // HTML content indicators
18
- /documentation|docs|guide|tutorial|api reference|getting started/i,
19
- // Meta tags
20
- /og:type.*article|documentation/i,
21
- ];
22
- NON_DOCUMENTATION_INDICATORS = [
23
- /\.(jpg|jpeg|png|gif|svg|pdf|zip|exe|dmg)$/i,
24
- /login|signup|register|checkout|cart|payment/i,
25
- /404|not found|error/i,
26
- ];
27
- // SPA detection patterns
28
- SPA_INDICATORS = [
29
- // React/Vue/Angular indicators
30
- /<div[^>]*id=["'](?:root|app|__next|gatsby-focus-wrapper|___gatsby)[^"']*["']/i,
31
- /<div[^>]*id=["'][^"']*root[^"']*["']/i,
32
- /react|vue|angular|svelte/i,
33
- // Framework-specific patterns
34
- /__NEXT_DATA__|gatsby|nuxt|next\.js/i,
35
- /<script[^>]*src=["'][^"']*(?:react|vue|angular|svelte)[^"']*["']/i,
36
- // Minimal HTML with script tags (typical SPA structure)
37
- /<body[^>]*>[\s\S]{0,500}<script[^>]*src=["'][^"']*app[^"']*\.js["']/i,
38
- // Empty or minimal content with scripts
39
- /<body[^>]*>[\s\S]{0,1000}<script[^>]*type=["']module["']/i,
40
- // Common SPA meta tags
41
- /<meta[^>]*name=["']generator["'][^>]*content=["'][^"']*(?:gatsby|next|nuxt|vuepress)[^"']*["']/i,
42
- ];
43
- constructor(httpClient) {
44
- this.httpClient = httpClient || new HttpClient();
45
- }
46
- /**
47
- * Detect if a website is a Single Page Application (SPA)
48
- * that requires JavaScript rendering
49
- */
50
- async detectSPA(url, html) {
51
- const indicators = [];
52
- let confidence = 'low';
53
- try {
54
- // If HTML not provided, fetch a sample
55
- if (!html) {
56
- const response = await this.httpClient.get(url, {
57
- timeout: 5000,
58
- headers: {
59
- 'User-Agent': 'Safe-Coder-MCP/1.0.0',
60
- 'Accept': 'text/html',
61
- },
62
- maxContentLength: 100000, // 100KB for SPA detection
63
- });
64
- html = typeof response.data === 'string' ? response.data : String(response.data);
65
- }
66
- // Check for SPA indicators
67
- for (const pattern of this.SPA_INDICATORS) {
68
- if (pattern.test(html)) {
69
- const match = html.match(pattern);
70
- if (match) {
71
- const indicator = match[0].substring(0, 100);
72
- indicators.push(indicator);
73
- }
74
- }
75
- }
76
- // Check for minimal content with many script tags (SPA pattern)
77
- const scriptCount = (html.match(/<script[^>]*>/gi) || []).length;
78
- const bodyContent = html.match(/<body[^>]*>([\s\S]*?)<\/body>/i)?.[1] || '';
79
- const bodyTextLength = bodyContent.replace(/<[^>]+>/g, '').trim().length;
80
- if (scriptCount >= 3 && bodyTextLength < 500) {
81
- indicators.push(`Minimal content (${bodyTextLength} chars) with ${scriptCount} script tags`);
82
- confidence = 'high';
83
- }
84
- // Check for React/Vue/Angular specific patterns
85
- if (/react|vue|angular|svelte/i.test(html)) {
86
- indicators.push('Framework detected in HTML');
87
- confidence = confidence === 'low' ? 'medium' : 'high';
88
- }
89
- // Check for Next.js/Gatsby specific patterns
90
- if (/__NEXT_DATA__|gatsby|next\.js/i.test(html)) {
91
- indicators.push('SSR/SSG framework detected');
92
- confidence = 'high';
93
- }
94
- // Determine confidence level
95
- if (indicators.length >= 3) {
96
- confidence = 'high';
97
- }
98
- else if (indicators.length >= 2) {
99
- confidence = 'medium';
100
- }
101
- const suggestion = confidence !== 'low'
102
- ? 'This appears to be a Single Page Application (SPA) that requires JavaScript rendering. HTTP-only crawling may not capture all content. Consider using browser automation tools (like Cursor/Claude browser tools) to get fully rendered HTML before processing.'
103
- : undefined;
104
- return {
105
- isSPA: confidence !== 'low',
106
- confidence,
107
- indicators: indicators.slice(0, 5), // Limit to 5 indicators
108
- suggestion,
109
- };
110
- }
111
- catch (error) {
112
- logger.debug('SPA detection failed', {
113
- url,
114
- error: error instanceof Error ? error.message : String(error),
115
- });
116
- return {
117
- isSPA: false,
118
- confidence: 'low',
119
- indicators: [],
120
- };
121
- }
122
- }
123
- /**
124
- * Check if a URL is likely a documentation page
125
- */
126
- async isDocumentationPage(url) {
127
- try {
128
- // Quick URL check first
129
- if (this.NON_DOCUMENTATION_INDICATORS.some(pattern => pattern.test(url))) {
130
- return false;
131
- }
132
- // Check URL patterns
133
- const hasDocPattern = this.DOCUMENTATION_INDICATORS.some(pattern => pattern.test(url));
134
- if (hasDocPattern) {
135
- return true;
136
- }
137
- // Fetch a small sample to check content
138
- const response = await this.httpClient.get(url, {
139
- timeout: 5000,
140
- headers: {
141
- 'User-Agent': 'Safe-Coder-MCP/1.0.0',
142
- 'Accept': 'text/html',
143
- },
144
- maxContentLength: 50000, // Limit to 50KB for quick check
145
- });
146
- const html = typeof response.data === 'string' ? response.data : String(response.data);
147
- // Check for documentation indicators in HTML
148
- const hasDocContent = this.DOCUMENTATION_INDICATORS.some(pattern => pattern.test(html));
149
- const hasNonDocContent = this.NON_DOCUMENTATION_INDICATORS.some(pattern => pattern.test(html));
150
- // Check for common documentation HTML structures
151
- const hasDocStructure = /<nav[^>]*>.*?(?:table of contents|toc|sidebar|menu)/is.test(html) ||
152
- /<aside[^>]*>.*?(?:navigation|toc|sidebar)/is.test(html) ||
153
- /class="[^"]*(?:doc|documentation|guide|tutorial|api)[^"]*"/i.test(html);
154
- return (hasDocContent || hasDocStructure) && !hasNonDocContent;
155
- }
156
- catch (error) {
157
- // If we can't fetch, assume it might be documentation
158
- // Let the full fetch handle the error
159
- return true;
160
- }
161
- }
162
- /**
163
- * Browse a documentation page and extract content
164
- * Uses HTTP client (axios) exclusively - no browser automation
165
- */
166
- async browsePage(url, query) {
167
- try {
168
- const fullUrl = url.startsWith('http') ? url : `https://${url}`;
169
- const baseUrl = new URL(fullUrl).origin;
170
- // Log HTTP request (not browser)
171
- logger.debug('Making HTTP GET request (no browser)', {
172
- url: fullUrl,
173
- method: 'HTTP GET',
174
- client: 'axios/HttpClient',
175
- });
176
- const response = await this.httpClient.get(fullUrl, {
177
- timeout: 15000,
178
- headers: {
179
- 'User-Agent': 'Safe-Coder-MCP/1.0.0',
180
- 'Accept': 'text/html',
181
- },
182
- });
183
- logger.debug('HTTP response received, parsing HTML', {
184
- url: fullUrl,
185
- statusCode: response.status,
186
- contentType: response.headers['content-type'],
187
- });
188
- const html = typeof response.data === 'string' ? response.data : String(response.data);
189
- // Check if it's documentation
190
- const isDoc = await this.isDocumentationPage(fullUrl);
191
- if (!isDoc) {
192
- throw new Error('The provided URL does not appear to be a documentation page. Please provide a documentation URL (e.g., /docs/, /documentation/, /guide/, /api/, etc.)');
193
- }
194
- // Detect SPA and warn if detected
195
- const spaDetection = await this.detectSPA(fullUrl, html);
196
- if (spaDetection.isSPA && spaDetection.confidence !== 'low') {
197
- logger.warn('SPA detected - content may be incomplete', {
198
- url: fullUrl,
199
- confidence: spaDetection.confidence,
200
- indicators: spaDetection.indicators,
201
- suggestion: spaDetection.suggestion,
202
- });
203
- }
204
- // Parse HTML
205
- const parsed = this.parseHTML(html, baseUrl, fullUrl);
206
- // Filter content by query if provided
207
- let filteredContent = parsed.content;
208
- let filteredSections = parsed.sections;
209
- if (query) {
210
- const queryLower = query.toLowerCase();
211
- filteredSections = parsed.sections.filter(section => section.title.toLowerCase().includes(queryLower) ||
212
- section.content.toLowerCase().includes(queryLower));
213
- if (filteredSections.length > 0) {
214
- filteredContent = filteredSections.map(s => `## ${s.title}\n\n${s.content}`).join('\n\n');
215
- }
216
- else {
217
- // If no sections match, search in full content
218
- if (parsed.searchableContent.toLowerCase().includes(queryLower)) {
219
- // Extract relevant paragraphs
220
- const paragraphs = parsed.content.split('\n\n');
221
- const relevant = paragraphs.filter(p => p.toLowerCase().includes(queryLower));
222
- filteredContent = relevant.join('\n\n');
223
- }
224
- else {
225
- filteredContent = `No content found matching "${query}". Showing full page content:\n\n${parsed.content}`;
226
- }
227
- }
228
- }
229
- return {
230
- url: fullUrl,
231
- title: parsed.title,
232
- content: filteredContent,
233
- isDocumentation: true,
234
- navigationLinks: parsed.navigationLinks,
235
- sections: filteredSections.length > 0 ? filteredSections : parsed.sections,
236
- searchableContent: parsed.searchableContent,
237
- headings: parsed.headings,
238
- codeSamples: parsed.codeSamples,
239
- };
240
- }
241
- catch (error) {
242
- if (error instanceof Error && error.message.includes('does not appear to be a documentation')) {
243
- throw error;
244
- }
245
- throw new Error(`Failed to browse documentation page: ${error instanceof Error ? error.message : 'Unknown error'}`);
246
- }
247
- }
248
- /**
249
- * Navigate to a specific page in the documentation
250
- */
251
- async navigateTo(url, baseUrl) {
252
- const fullUrl = url.startsWith('http')
253
- ? url
254
- : baseUrl
255
- ? new URL(url, baseUrl).href
256
- : `https://${url}`;
257
- return this.browsePage(fullUrl);
258
- }
259
- /**
260
- * Parse HTML and extract documentation content
261
- */
262
- parseHTML(html, baseUrl, currentUrl) {
263
- // Extract title
264
- const titleMatch = html.match(/<title[^>]*>([^<]+)<\/title>/i);
265
- const title = titleMatch ? titleMatch[1].trim() : 'Documentation';
266
- // Remove scripts and styles
267
- let cleanHtml = html
268
- .replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '')
269
- .replace(/<style[^>]*>[\s\S]*?<\/style>/gi, '')
270
- .replace(/<!--[\s\S]*?-->/g, '');
271
- // Extract navigation links (primary source - from nav/aside elements)
272
- const navigationLinks = [];
273
- const navigationLinksSet = new Set(); // For deduplication
274
- // Find nav, aside, or sidebar elements
275
- const navMatches = cleanHtml.match(/<(?:nav|aside)[^>]*>([\s\S]*?)<\/(?:nav|aside)>/gi);
276
- logger.debug('Extracting navigation links', {
277
- navElementsFound: navMatches ? navMatches.length : 0,
278
- url: currentUrl,
279
- });
280
- if (navMatches) {
281
- navMatches.forEach(navHtml => {
282
- const linkMatches = navHtml.matchAll(/<a[^>]+href=["']([^"']+)["'][^>]*>([\s\S]*?)<\/a>/gi);
283
- for (const match of linkMatches) {
284
- const href = match[1];
285
- let text = match[2].replace(/<[^>]+>/g, '').trim();
286
- if (text && href && !href.startsWith('#')) {
287
- try {
288
- const fullUrl = href.startsWith('http')
289
- ? href
290
- : new URL(href, baseUrl).href;
291
- const normalizedUrl = fullUrl.split('#')[0]; // Remove fragments
292
- const isInternal = new URL(fullUrl).origin === new URL(currentUrl).origin;
293
- // Deduplicate by normalized URL
294
- if (!navigationLinksSet.has(normalizedUrl)) {
295
- navigationLinks.push({ text, url: normalizedUrl, isInternal });
296
- navigationLinksSet.add(normalizedUrl);
297
- }
298
- }
299
- catch {
300
- // Invalid URL, skip
301
- }
302
- }
303
- }
304
- });
305
- }
306
- logger.debug('Navigation links extraction completed', {
307
- navLinksFound: navigationLinks.length,
308
- internalNavLinks: navigationLinks.filter(l => l.isInternal).length,
309
- externalNavLinks: navigationLinks.filter(l => !l.isInternal).length,
310
- });
311
- // Extract links from main content area (secondary source)
312
- const contentLinks = [];
313
- // Extract main content area for link discovery
314
- let contentArea = '';
315
- const mainMatches = cleanHtml.match(/<main[^>]*>([\s\S]*?)<\/main>/i) ||
316
- cleanHtml.match(/<article[^>]*>([\s\S]*?)<\/article>/i) ||
317
- cleanHtml.match(/<div[^>]*class="[^"]*(?:content|main|documentation|doc)[^"]*"[^>]*>([\s\S]*?)<\/div>/i);
318
- if (mainMatches) {
319
- contentArea = mainMatches[1];
320
- }
321
- else {
322
- // Fallback: use body content
323
- const bodyMatch = cleanHtml.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
324
- contentArea = bodyMatch ? bodyMatch[1] : cleanHtml;
325
- }
326
- // Extract links from content area
327
- logger.debug('Extracting links from content area', {
328
- contentAreaLength: contentArea.length,
329
- url: currentUrl,
330
- });
331
- const contentLinkMatches = contentArea.matchAll(/<a[^>]+href=["']([^"']+)["'][^>]*>([\s\S]*?)<\/a>/gi);
332
- for (const match of contentLinkMatches) {
333
- const href = match[1];
334
- let text = match[2].replace(/<[^>]+>/g, '').trim();
335
- if (text && href && !href.startsWith('#')) {
336
- try {
337
- const fullUrl = href.startsWith('http')
338
- ? href
339
- : new URL(href, baseUrl).href;
340
- const normalizedUrl = fullUrl.split('#')[0]; // Remove fragments
341
- const isInternal = new URL(fullUrl).origin === new URL(currentUrl).origin;
342
- // Only add if not already in navigation links (deduplication)
343
- if (!navigationLinksSet.has(normalizedUrl)) {
344
- contentLinks.push({ text, url: normalizedUrl, isInternal });
345
- navigationLinksSet.add(normalizedUrl);
346
- }
347
- }
348
- catch {
349
- // Invalid URL, skip
350
- }
351
- }
352
- }
353
- logger.debug('Content links extraction completed', {
354
- contentLinksFound: contentLinks.length,
355
- internalContentLinks: contentLinks.filter(l => l.isInternal).length,
356
- externalContentLinks: contentLinks.filter(l => !l.isInternal).length,
357
- });
358
- // Fallback: Extract links from entire body if we found very few links
359
- // This handles cases where React/SPA sites don't have standard nav/aside structures
360
- const bodyLinks = [];
361
- if (navigationLinks.length + contentLinks.length < 5) {
362
- logger.debug('Few links found from nav/content, extracting from entire body as fallback', {
363
- navLinks: navigationLinks.length,
364
- contentLinks: contentLinks.length,
365
- });
366
- // Extract body content
367
- const bodyMatch = cleanHtml.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
368
- const bodyContent = bodyMatch ? bodyMatch[1] : cleanHtml;
369
- // Extract all links from body
370
- const bodyLinkMatches = bodyContent.matchAll(/<a[^>]+href=["']([^"']+)["'][^>]*>([\s\S]*?)<\/a>/gi);
371
- for (const match of bodyLinkMatches) {
372
- const href = match[1];
373
- let text = match[2].replace(/<[^>]+>/g, '').trim();
374
- // Skip empty links or anchor-only links
375
- if (!text || !href || href.startsWith('#')) {
376
- continue;
377
- }
378
- try {
379
- const fullUrl = href.startsWith('http')
380
- ? href
381
- : new URL(href, baseUrl).href;
382
- const normalizedUrl = fullUrl.split('#')[0]; // Remove fragments
383
- const isInternal = new URL(fullUrl).origin === new URL(currentUrl).origin;
384
- // Only add if not already in navigation or content links (deduplication)
385
- if (!navigationLinksSet.has(normalizedUrl)) {
386
- bodyLinks.push({ text, url: normalizedUrl, isInternal });
387
- navigationLinksSet.add(normalizedUrl);
388
- }
389
- }
390
- catch {
391
- // Invalid URL, skip
392
- }
393
- }
394
- logger.debug('Body fallback extraction completed', {
395
- bodyLinksFound: bodyLinks.length,
396
- totalLinksNow: navigationLinks.length + contentLinks.length + bodyLinks.length,
397
- });
398
- }
399
- // Combine navigation links (priority) with content links and body links
400
- const allLinks = [...navigationLinks, ...contentLinks, ...bodyLinks];
401
- // Extract main content (reuse contentArea if already extracted, otherwise extract again)
402
- let mainContent = contentArea || '';
403
- if (!mainContent) {
404
- const mainMatches = cleanHtml.match(/<main[^>]*>([\s\S]*?)<\/main>/i) ||
405
- cleanHtml.match(/<article[^>]*>([\s\S]*?)<\/article>/i) ||
406
- cleanHtml.match(/<div[^>]*class="[^"]*(?:content|main|documentation|doc)[^"]*"[^>]*>([\s\S]*?)<\/div>/i);
407
- if (mainMatches) {
408
- mainContent = mainMatches[1];
409
- }
410
- else {
411
- // Fallback: use body content
412
- const bodyMatch = cleanHtml.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
413
- mainContent = bodyMatch ? bodyMatch[1] : cleanHtml;
414
- }
415
- }
416
- // Extract headings with structure
417
- const headings = [];
418
- const headingMatches = mainContent.matchAll(/<h([1-6])[^>]*(?:id=["']([^"']+)["'])?[^>]*>([^<]+)<\/h[1-6]>/gi);
419
- for (const match of headingMatches) {
420
- const level = `h${match[1]}`;
421
- const text = match[3].replace(/<[^>]+>/g, '').trim();
422
- const id = match[2];
423
- if (text) {
424
- headings.push({ level, text, id });
425
- }
426
- }
427
- // Extract code samples with language detection
428
- const codeSamples = [];
429
- // Match <pre><code> blocks (with optional language class)
430
- const codeBlockMatches = mainContent.matchAll(/<pre[^>]*><code[^>]*(?:class=["'][^"']*language-([^"'\s]+)[^"']*["']|data-language=["']([^"']+)["'])?[^>]*>([\s\S]*?)<\/code><\/pre>/gi);
431
- for (const match of codeBlockMatches) {
432
- const language = (match[1] || match[2] || 'unknown').toLowerCase();
433
- let code = match[3].replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&amp;/g, '&').replace(/&quot;/g, '"').replace(/&#39;/g, "'");
434
- code = code.replace(/<[^>]+>/g, '').trim();
435
- if (code.length > 10) {
436
- // Try to detect language from code content if not specified
437
- const detectedLang = this.detectLanguage(code, language);
438
- codeSamples.push({ code, language: detectedLang });
439
- }
440
- }
441
- // Also extract inline code blocks that might be significant
442
- const inlineCodeMatches = mainContent.matchAll(/<code[^>]*(?:class=["'][^"']*language-([^"'\s]+)[^"']*["'])?[^>]*>([\s\S]*?)<\/code>/gi);
443
- for (const match of inlineCodeMatches) {
444
- const language = (match[1] || 'unknown').toLowerCase();
445
- let code = match[2].replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&amp;/g, '&').replace(/&quot;/g, '"').replace(/&#39;/g, "'");
446
- code = code.replace(/<[^>]+>/g, '').trim();
447
- // Only include if it's substantial (more than just a variable name)
448
- if (code.length > 20 && !codeSamples.some(s => s.code === code)) {
449
- const detectedLang = this.detectLanguage(code, language);
450
- codeSamples.push({ code, language: detectedLang });
451
- }
452
- }
453
- // Convert HTML to markdown-like text
454
- let textContent = mainContent
455
- // Headers
456
- .replace(/<h([1-6])[^>]*>([^<]+)<\/h[1-6]>/gi, (_, level, text) => {
457
- const prefix = '#'.repeat(parseInt(level));
458
- return `\n${prefix} ${text.trim()}\n`;
459
- })
460
- // Links
461
- .replace(/<a[^>]+href=["']([^"']+)["'][^>]*>([^<]+)<\/a>/gi, '[$2]($1)')
462
- // Code blocks
463
- .replace(/<pre[^>]*><code[^>]*>([\s\S]*?)<\/code><\/pre>/gi, '```\n$1\n```')
464
- .replace(/<code[^>]*>([^<]+)<\/code>/gi, '`$1`')
465
- // Lists
466
- .replace(/<li[^>]*>([^<]+)<\/li>/gi, '- $1')
467
- // Paragraphs
468
- .replace(/<p[^>]*>([^<]+)<\/p>/gi, '$1\n')
469
- // Remove remaining HTML tags
470
- .replace(/<[^>]+>/g, ' ')
471
- // Clean up whitespace
472
- .replace(/\n{3,}/g, '\n\n')
473
- .replace(/[ \t]+/g, ' ')
474
- .trim();
475
- // Extract sections (based on headers)
476
- const sections = [];
477
- const sectionMatches = textContent.matchAll(/(?:^|\n)(#{1,6})\s+(.+?)(?=\n#{1,6}|\n*$)/gs);
478
- let lastIndex = 0;
479
- for (const match of sectionMatches) {
480
- const headerLevel = match[1].length;
481
- const headerText = match[2].trim();
482
- const startIndex = match.index || 0;
483
- // Get content until next header of same or higher level
484
- const nextHeaderPattern = new RegExp(`\n#{1,${headerLevel}}\\s+`, 'g');
485
- nextHeaderPattern.lastIndex = startIndex + match[0].length;
486
- const nextMatch = nextHeaderPattern.exec(textContent);
487
- const endIndex = nextMatch ? nextMatch.index : textContent.length;
488
- const sectionContent = textContent.substring(startIndex + match[0].length, endIndex).trim();
489
- if (sectionContent) {
490
- sections.push({
491
- title: headerText,
492
- content: sectionContent,
493
- anchor: `#${headerText.toLowerCase().replace(/\s+/g, '-')}`,
494
- });
495
- }
496
- lastIndex = endIndex;
497
- }
498
- // If no sections found, create one from all content
499
- if (sections.length === 0 && textContent) {
500
- sections.push({
501
- title: title,
502
- content: textContent,
503
- });
504
- }
505
- const finalLinks = allLinks.slice(0, 100); // Limit to 100 links
506
- logger.debug('Link extraction summary', {
507
- url: currentUrl,
508
- navLinks: navigationLinks.length,
509
- contentLinks: contentLinks.length,
510
- bodyLinks: bodyLinks.length,
511
- totalLinks: allLinks.length,
512
- finalLinksCount: finalLinks.length,
513
- sampleLinks: finalLinks.slice(0, 5).map(l => ({ text: l.text.substring(0, 30), url: l.url, isInternal: l.isInternal })),
514
- });
515
- return {
516
- title,
517
- content: textContent || 'No content extracted',
518
- navigationLinks: finalLinks,
519
- sections,
520
- searchableContent: textContent.toLowerCase(),
521
- headings,
522
- codeSamples,
523
- };
524
- }
525
- /**
526
- * Detect programming language from code content
527
- */
528
- detectLanguage(code, fallback) {
529
- if (fallback && fallback !== 'unknown') {
530
- return fallback;
531
- }
532
- // Simple heuristics for language detection
533
- const patterns = [
534
- { pattern: /^(import|export|from|const|let|var|function|class|interface|type)\s/, language: 'typescript' },
535
- { pattern: /^(import|export|from|const|let|var|function|class)\s/, language: 'javascript' },
536
- { pattern: /^(def|class|import|from|if __name__)/, language: 'python' },
537
- { pattern: /^(package|import|public class|private|protected)/, language: 'java' },
538
- { pattern: /^(#include|using namespace|int main|std::)/, language: 'cpp' },
539
- { pattern: /^(fn |let |struct |impl |use |pub )/, language: 'rust' },
540
- { pattern: /^(func |package |import |var |const )/, language: 'go' },
541
- { pattern: /^(<?php|<\?=)/, language: 'php' },
542
- { pattern: /^(SELECT|INSERT|UPDATE|DELETE|CREATE|ALTER)\s/i, language: 'sql' },
543
- { pattern: /^(<html|<!DOCTYPE|<!doctype)/i, language: 'html' },
544
- { pattern: /^(\.|#|@|body|div|margin|padding|color:)/, language: 'css' },
545
- { pattern: /^(json|yaml|xml)/i, language: 'json' },
546
- ];
547
- for (const { pattern, language } of patterns) {
548
- if (pattern.test(code)) {
549
- return language;
550
- }
551
- }
552
- return 'text';
553
- }
554
- }
555
- //# sourceMappingURL=web-doc-browser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"web-doc-browser.js","sourceRoot":"","sources":["../../src/documentation/web-doc-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAoC5C,MAAM,OAAO,uBAAuB;IAC1B,UAAU,CAAa;IACd,wBAAwB,GAAG;QAC1C,eAAe;QACf,YAAY;QACZ,kBAAkB;QAClB,UAAU;QACV,aAAa;QACb,QAAQ;QACR,cAAc;QACd,WAAW;QACX,SAAS;QACT,UAAU;QACV,oBAAoB;QACpB,0BAA0B;QAC1B,kEAAkE;QAClE,YAAY;QACZ,iCAAiC;KAClC,CAAC;IAEe,4BAA4B,GAAG;QAC9C,4CAA4C;QAC5C,8CAA8C;QAC9C,sBAAsB;KACvB,CAAC;IAEF,yBAAyB;IACR,cAAc,GAAG;QAChC,+BAA+B;QAC/B,+EAA+E;QAC/E,uCAAuC;QACvC,2BAA2B;QAC3B,8BAA8B;QAC9B,qCAAqC;QACrC,mEAAmE;QACnE,wDAAwD;QACxD,sEAAsE;QACtE,wCAAwC;QACxC,2DAA2D;QAC3D,uBAAuB;QACvB,iGAAiG;KAClG,CAAC;IAEF,YAAY,UAAuB;QACjC,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,IAAI,UAAU,EAAE,CAAC;IACnD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,IAAa;QACxC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,IAAI,UAAU,GAA8B,KAAK,CAAC;QAElD,IAAI,CAAC;YACH,uCAAuC;YACvC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE;oBAC9C,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE;wBACP,YAAY,EAAE,sBAAsB;wBACpC,QAAQ,EAAE,WAAW;qBACtB;oBACD,gBAAgB,EAAE,MAAM,EAAE,0BAA0B;iBACrD,CAAC,CAAC;gBACH,IAAI,GAAG,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnF,CAAC;YAED,2BAA2B;YAC3B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC1C,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAClC,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;wBAC7C,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC;YACH,CAAC;YAED,gEAAgE;YAChE,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACjE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5E,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC;YAEzE,IAAI,WAAW,IAAI,CAAC,IAAI,cAAc,GAAG,GAAG,EAAE,CAAC;gBAC7C,UAAU,CAAC,IAAI,CAAC,oBAAoB,cAAc,gBAAgB,WAAW,cAAc,CAAC,CAAC;gBAC7F,UAAU,GAAG,MAAM,CAAC;YACtB,CAAC;YAED,gDAAgD;YAChD,IAAI,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3C,UAAU,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBAC9C,UAAU,GAAG,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;YACxD,CAAC;YAED,6CAA6C;YAC7C,IAAI,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChD,UAAU,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBAC9C,UAAU,GAAG,MAAM,CAAC;YACtB,CAAC;YAED,6BAA6B;YAC7B,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC3B,UAAU,GAAG,MAAM,CAAC;YACtB,CAAC;iBAAM,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAClC,UAAU,GAAG,QAAQ,CAAC;YACxB,CAAC;YAED,MAAM,UAAU,GAAG,UAAU,KAAK,KAAK;gBACrC,CAAC,CAAC,iQAAiQ;gBACnQ,CAAC,CAAC,SAAS,CAAC;YAEd,OAAO;gBACL,KAAK,EAAE,UAAU,KAAK,KAAK;gBAC3B,UAAU;gBACV,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,wBAAwB;gBAC5D,UAAU;aACX,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;gBACnC,GAAG;gBACH,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,KAAK;gBACjB,UAAU,EAAE,EAAE;aACf,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,GAAW;QACnC,IAAI,CAAC;YACH,wBAAwB;YACxB,IAAI,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACzE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,qBAAqB;YACrB,MAAM,aAAa,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACvF,IAAI,aAAa,EAAE,CAAC;gBAClB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,wCAAwC;YACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC9C,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP,YAAY,EAAE,sBAAsB;oBACpC,QAAQ,EAAE,WAAW;iBACtB;gBACD,gBAAgB,EAAE,KAAK,EAAE,gCAAgC;aAC1D,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAEvF,6CAA6C;YAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACxF,MAAM,gBAAgB,GAAG,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAE/F,iDAAiD;YACjD,MAAM,eAAe,GACnB,uDAAuD,CAAC,IAAI,CAAC,IAAI,CAAC;gBAClE,6CAA6C,CAAC,IAAI,CAAC,IAAI,CAAC;gBACxD,6DAA6D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE3E,OAAO,CAAC,aAAa,IAAI,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC;QACjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sDAAsD;YACtD,sCAAsC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CACd,GAAW,EACX,KAAc;QAEd,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,EAAE,CAAC;YAChE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;YAExC,iCAAiC;YACjC,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE;gBACnD,GAAG,EAAE,OAAO;gBACZ,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,kBAAkB;aAC3B,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE;gBAClD,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE;oBACP,YAAY,EAAE,sBAAsB;oBACpC,QAAQ,EAAE,WAAW;iBACtB;aACF,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE;gBACnD,GAAG,EAAE,OAAO;gBACZ,UAAU,EAAE,QAAQ,CAAC,MAAM;gBAC3B,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC;aAC9C,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAEvF,8BAA8B;YAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACtD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,uJAAuJ,CAAC,CAAC;YAC3K,CAAC;YAED,kCAAkC;YAClC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACzD,IAAI,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;gBAC5D,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE;oBACtD,GAAG,EAAE,OAAO;oBACZ,UAAU,EAAE,YAAY,CAAC,UAAU;oBACnC,UAAU,EAAE,YAAY,CAAC,UAAU;oBACnC,UAAU,EAAE,YAAY,CAAC,UAAU;iBACpC,CAAC,CAAC;YACL,CAAC;YAED,aAAa;YACb,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEtD,sCAAsC;YACtC,IAAI,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC;YACrC,IAAI,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC;YAEvC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;gBACvC,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAClD,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;oBAChD,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CACnD,CAAC;gBAEF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChC,eAAe,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACzC,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,OAAO,EAAE,CAChC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACjB,CAAC;qBAAM,CAAC;oBACN,+CAA+C;oBAC/C,IAAI,MAAM,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;wBAChE,8BAA8B;wBAC9B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;wBAChD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACrC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CACrC,CAAC;wBACF,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC1C,CAAC;yBAAM,CAAC;wBACN,eAAe,GAAG,8BAA8B,KAAK,oCAAoC,MAAM,CAAC,OAAO,EAAE,CAAC;oBAC5G,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO;gBACL,GAAG,EAAE,OAAO;gBACZ,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,OAAO,EAAE,eAAe;gBACxB,eAAe,EAAE,IAAI;gBACrB,eAAe,EAAE,MAAM,CAAC,eAAe;gBACvC,QAAQ,EAAE,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ;gBAC1E,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;gBAC3C,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,WAAW,EAAE,MAAM,CAAC,WAAW;aAChC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,uCAAuC,CAAC,EAAE,CAAC;gBAC9F,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACtH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,GAAW,EAAE,OAAgB;QAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;YACpC,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,OAAO;gBACP,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,IAAI;gBAC5B,CAAC,CAAC,WAAW,GAAG,EAAE,CAAC;QAEvB,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,IAAY,EAAE,OAAe,EAAE,UAAkB;QASjE,gBAAgB;QAChB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;QAElE,4BAA4B;QAC5B,IAAI,SAAS,GAAG,IAAI;aACjB,OAAO,CAAC,mCAAmC,EAAE,EAAE,CAAC;aAChD,OAAO,CAAC,iCAAiC,EAAE,EAAE,CAAC;aAC9C,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAEnC,sEAAsE;QACtE,MAAM,eAAe,GAA8D,EAAE,CAAC;QACtF,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC,CAAC,oBAAoB;QAElE,uCAAuC;QACvC,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACxF,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE;YAC1C,gBAAgB,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACpD,GAAG,EAAE,UAAU;SAChB,CAAC,CAAC;QAEH,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;gBAC3B,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,qDAAqD,CAAC,CAAC;gBAC5F,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;oBAChC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACtB,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;oBACnD,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC1C,IAAI,CAAC;4BACH,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gCACrC,CAAC,CAAC,IAAI;gCACN,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;4BAChC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB;4BAChE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;4BAE1E,gCAAgC;4BAChC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;gCAC3C,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;gCAC/D,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;4BACxC,CAAC;wBACH,CAAC;wBAAC,MAAM,CAAC;4BACP,oBAAoB;wBACtB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE;YACpD,aAAa,EAAE,eAAe,CAAC,MAAM;YACrC,gBAAgB,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM;YAClE,gBAAgB,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM;SACpE,CAAC,CAAC;QAEH,0DAA0D;QAC1D,MAAM,YAAY,GAA8D,EAAE,CAAC;QAEnF,+CAA+C;QAC/C,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,gCAAgC,CAAC;YACnE,SAAS,CAAC,KAAK,CAAC,sCAAsC,CAAC;YACvD,SAAS,CAAC,KAAK,CAAC,uFAAuF,CAAC,CAAC;QAE3G,IAAI,WAAW,EAAE,CAAC;YAChB,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,6BAA6B;YAC7B,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACpE,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrD,CAAC;QAED,kCAAkC;QAClC,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE;YACjD,iBAAiB,EAAE,WAAW,CAAC,MAAM;YACrC,GAAG,EAAE,UAAU;SAChB,CAAC,CAAC;QAEH,MAAM,kBAAkB,GAAG,WAAW,CAAC,QAAQ,CAAC,qDAAqD,CAAC,CAAC;QACvG,KAAK,MAAM,KAAK,IAAI,kBAAkB,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACnD,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1C,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;wBACrC,CAAC,CAAC,IAAI;wBACN,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;oBAChC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB;oBAChE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;oBAE1E,8DAA8D;oBAC9D,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;wBAC3C,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;wBAC5D,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;oBACxC,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,oBAAoB;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE;YACjD,iBAAiB,EAAE,YAAY,CAAC,MAAM;YACtC,oBAAoB,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM;YACnE,oBAAoB,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM;SACrE,CAAC,CAAC;QAEH,sEAAsE;QACtE,oFAAoF;QACpF,MAAM,SAAS,GAA8D,EAAE,CAAC;QAChF,IAAI,eAAe,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,2EAA2E,EAAE;gBACxF,QAAQ,EAAE,eAAe,CAAC,MAAM;gBAChC,YAAY,EAAE,YAAY,CAAC,MAAM;aAClC,CAAC,CAAC;YAEH,uBAAuB;YACvB,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACpE,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAEzD,8BAA8B;YAC9B,MAAM,eAAe,GAAG,WAAW,CAAC,QAAQ,CAAC,qDAAqD,CAAC,CAAC;YACpG,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;gBACpC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAEnD,wCAAwC;gBACxC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC3C,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;wBACrC,CAAC,CAAC,IAAI;wBACN,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;oBAChC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB;oBAChE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;oBAE1E,yEAAyE;oBACzE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;wBAC3C,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;wBACzD,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;oBACxC,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,oBAAoB;gBACtB,CAAC;YACH,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE;gBACjD,cAAc,EAAE,SAAS,CAAC,MAAM;gBAChC,aAAa,EAAE,eAAe,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM;aAC/E,CAAC,CAAC;QACL,CAAC;QAED,wEAAwE;QACxE,MAAM,QAAQ,GAAG,CAAC,GAAG,eAAe,EAAE,GAAG,YAAY,EAAE,GAAG,SAAS,CAAC,CAAC;QAErE,yFAAyF;QACzF,IAAI,WAAW,GAAG,WAAW,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,gCAAgC,CAAC;gBACnE,SAAS,CAAC,KAAK,CAAC,sCAAsC,CAAC;gBACvD,SAAS,CAAC,KAAK,CAAC,uFAAuF,CAAC,CAAC;YAE3G,IAAI,WAAW,EAAE,CAAC;gBAChB,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,6BAA6B;gBAC7B,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;gBACpE,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACrD,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,MAAM,QAAQ,GAAwD,EAAE,CAAC;QACzE,MAAM,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC,iEAAiE,CAAC,CAAC;QAC/G,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACrD,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,IAAI,EAAE,CAAC;gBACT,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,+CAA+C;QAC/C,MAAM,WAAW,GAA8C,EAAE,CAAC;QAClE,0DAA0D;QAC1D,MAAM,gBAAgB,GAAG,WAAW,CAAC,QAAQ,CAAC,wIAAwI,CAAC,CAAC;QACxL,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;YACnE,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACtI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBACrB,4DAA4D;gBAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACzD,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,MAAM,iBAAiB,GAAG,WAAW,CAAC,QAAQ,CAAC,wFAAwF,CAAC,CAAC;QACzI,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;YACvD,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACtI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3C,oEAAoE;YACpE,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBAChE,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACzD,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,IAAI,WAAW,GAAG,WAAW;YAC3B,UAAU;aACT,OAAO,CAAC,oCAAoC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAChE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3C,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;QACxC,CAAC,CAAC;YACF,QAAQ;aACP,OAAO,CAAC,kDAAkD,EAAE,UAAU,CAAC;YACxE,cAAc;aACb,OAAO,CAAC,kDAAkD,EAAE,cAAc,CAAC;aAC3E,OAAO,CAAC,8BAA8B,EAAE,MAAM,CAAC;YAChD,QAAQ;aACP,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC;YAC5C,aAAa;aACZ,OAAO,CAAC,wBAAwB,EAAE,MAAM,CAAC;YAC1C,6BAA6B;aAC5B,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;YACzB,sBAAsB;aACrB,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;aAC1B,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;aACvB,IAAI,EAAE,CAAC;QAEV,sCAAsC;QACtC,MAAM,QAAQ,GAA+D,EAAE,CAAC;QAChF,MAAM,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC,6CAA6C,CAAC,CAAC;QAE3F,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACpC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;YAEpC,wDAAwD;YACxD,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,SAAS,WAAW,OAAO,EAAE,GAAG,CAAC,CAAC;YACvE,iBAAiB,CAAC,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC3D,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACtD,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC;YAElE,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YAE5F,IAAI,cAAc,EAAE,CAAC;gBACnB,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK,EAAE,UAAU;oBACjB,OAAO,EAAE,cAAc;oBACvB,MAAM,EAAE,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;iBAC5D,CAAC,CAAC;YACL,CAAC;YAED,SAAS,GAAG,QAAQ,CAAC;QACvB,CAAC;QAED,oDAAoD;QACpD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,WAAW;aACrB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,qBAAqB;QAEhE,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;YACtC,GAAG,EAAE,UAAU;YACf,QAAQ,EAAE,eAAe,CAAC,MAAM;YAChC,YAAY,EAAE,YAAY,CAAC,MAAM;YACjC,SAAS,EAAE,SAAS,CAAC,MAAM;YAC3B,UAAU,EAAE,QAAQ,CAAC,MAAM;YAC3B,eAAe,EAAE,UAAU,CAAC,MAAM;YAClC,WAAW,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;SACxH,CAAC,CAAC;QAEH,OAAO;YACL,KAAK;YACL,OAAO,EAAE,WAAW,IAAI,sBAAsB;YAC9C,eAAe,EAAE,UAAU;YAC3B,QAAQ;YACR,iBAAiB,EAAE,WAAW,CAAC,WAAW,EAAE;YAC5C,QAAQ;YACR,WAAW;SACZ,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,IAAY,EAAE,QAAgB;QACnD,IAAI,QAAQ,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACvC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,2CAA2C;QAC3C,MAAM,QAAQ,GAAiD;YAC7D,EAAE,OAAO,EAAE,qEAAqE,EAAE,QAAQ,EAAE,YAAY,EAAE;YAC1G,EAAE,OAAO,EAAE,sDAAsD,EAAE,QAAQ,EAAE,YAAY,EAAE;YAC3F,EAAE,OAAO,EAAE,sCAAsC,EAAE,QAAQ,EAAE,QAAQ,EAAE;YACvE,EAAE,OAAO,EAAE,kDAAkD,EAAE,QAAQ,EAAE,MAAM,EAAE;YACjF,EAAE,OAAO,EAAE,4CAA4C,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC1E,EAAE,OAAO,EAAE,qCAAqC,EAAE,QAAQ,EAAE,MAAM,EAAE;YACpE,EAAE,OAAO,EAAE,uCAAuC,EAAE,QAAQ,EAAE,IAAI,EAAE;YACpE,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC7C,EAAE,OAAO,EAAE,gDAAgD,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC9E,EAAE,OAAO,EAAE,+BAA+B,EAAE,QAAQ,EAAE,MAAM,EAAE;YAC9D,EAAE,OAAO,EAAE,0CAA0C,EAAE,QAAQ,EAAE,KAAK,EAAE;YACxE,EAAE,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,EAAE;SACnD,CAAC;QAEF,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC7C,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -1,9 +0,0 @@
1
- import type { DetectedError } from './pattern-matcher.js';
2
- export declare class ApiValidator {
3
- detectErrors(code: string, filename?: string): DetectedError[];
4
- private visitNode;
5
- private looksLikeAsyncFunction;
6
- private getLineAndChar;
7
- private prioritize;
8
- }
9
- //# sourceMappingURL=api-validator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-validator.d.ts","sourceRoot":"","sources":["../../src/errors/api-validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,qBAAa,YAAY;IACvB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAkB,GAAG,aAAa,EAAE;IAqBzE,OAAO,CAAC,SAAS;IA8BjB,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,UAAU;CAGnB"}